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

为什么XPath在Scrapy Shell中生效但在CrawlSpider中不生效?

问题分析
  • LinkExtractor配置错误
    restrict_xpaths参数的作用是限定查找链接的DOM范围,不是直接指定链接属性路径。你写的//a[@data-role="link"]/data-href是查找a标签下名为data-href的子节点,而非a标签的data-href属性。同时LinkExtractor默认仅提取a标签的href属性作为链接地址,你需要额外指定attrs参数才能提取自定义的data-href属性。
  • 回调函数命名错误
    CrawlSpider内部依赖自带的parse方法处理响应、执行规则匹配,你重写了parse方法会直接覆盖原有规则逻辑,导致链接提取失效,CrawlSpider的自定义回调禁止使用parse作为函数名。
  • 请求未生效
    你在回调中生成的Request对象没有使用yield返回,Scrapy不会调度执行该请求。
修复方案

修改后的完整代码如下:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class AutoCrawlSpider(CrawlSpider):
    name = 'auto_crawl'
    allowed_domains = ['<my site>']
    start_urls = ['<my site>']
    rules = [
        Rule(
            LinkExtractor(
                # 限定只在data-role为link的a标签范围内提取链接
                restrict_xpaths='//a[@data-role="link"]',
                # 指定提取a标签的data-href属性作为链接地址
                attrs=('data-href',)
            ),
            callback='parse_item',
            follow=True
        )
    ]

    def parse_item(self, response, **kwargs):
        print(f'Crawling {response.url} with HTTP {response.status}')
        # 如需生成新请求,必须使用yield返回Request对象
        # yield scrapy.Request(url=目标链接, callback=对应回调函数)
        pass

内容的提问来源于stack exchange,提问作者Eric Humbert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:06:02