为什么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
相关产品推荐
相关产品推荐

