Scrapy爬取网页时距离字段返回空值的解决咨询
解决Scrapy爬取赛事距离的问题
你当前提取距离的代码存在两个核心问题:
- 距离是整场赛事的公共信息,存放在页面顶部的
race-header区域,不属于循环遍历的race-runner节点子元素,不能从每个赛犬行节点内查找。 - 原XPath定位的元素错误,距离并不在
race-header__info__grade下的a标签中。
修改方案
1. 提前提取赛事距离
在遍历赛犬列表前,先从页面全局提取一次距离值(因为整场比赛距离统一,无需重复提取)。
2. 修正XPath定位
根据目标页面结构,距离信息的正确定位方式有两种(可根据实际页面结构选择):
修改后的完整代码
rules = ( Rule(LinkExtractor(restrict_xpaths="//td[@class='meetings-venues__race-time']/a"), callback='parse_item', follow=True), ) def parse_item(self, response): # 提取整场比赛的距离,优先使用精准类名定位 race_distance = response.xpath("//div[@class='race-header__info__distance']/text()").extract_first() # 若类名定位失效,改用文本内容匹配的备选方案 # race_distance = response.xpath("//div[@class='race-header__info']//span[contains(text(), 'm')]/text()").extract_first() hxs = Selector(response) divs = hxs.xpath('//tr[@class="accordion__anchor race-runner"]') for div in divs: item = { 'grade' : div.xpath(".//td[@class='race-runners__grade']/text()").extract(), 'greyhound' : div.xpath('./td[3]/div[1]/a/text()').extract(), 'position' : div.xpath('./td[1]/text()').extract(), 'trainer' : div.xpath(".//div[@class='race-runners__name__trainer']/a/text()").extract(), 'weight' : div.xpath(".//td[@class='race-runners__weight']/text()").extract(), 'first_sec' : div.xpath(".//td[@class='race-runners__sectional']/text()").extract_first(), 'second_sec' : div.xpath(".//td[@class='race-runners__sectional'][2]/text()").extract(), 'time' : div.xpath(".//td[@class='race-runners__time']/text()").extract(), 'margin' : div.xpath(".//td[@class='race-runners__margin']/text()").extract(), 'distance' : race_distance, # 直接复用提前提取的距离值 'starting_price' : div.xpath(".//td[@class='race-runners__starting-price']/text()").extract(), 'date' : response.url.split('/')[-3], 'track' : response.url.split('/')[-4], 'rug' : div.xpath('.//td[@class="table__cell--tight race-runners__box"]/sprite-svg/@name').get() } yield item
补充说明
- 全局提取距离既符合页面数据逻辑,也能减少DOM查询次数,提升爬取效率。
- 若页面后续结构调整,可优先通过浏览器开发者工具查看距离元素的最新类名或路径,再调整XPath。
内容的提问来源于stack exchange,提问作者undecided000
相关产品推荐
相关产品推荐

