You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:03:31