如何为Scrapy CrawlSpider的LinkExtractor设置优先取footer链接的XPath规则
解决方案
你原来的写法存在两个问题:
- 额外包含了
//head区域,该区域通常仅存储页面元数据,几乎没有可爬取的业务页面链接 - 直接传入多个XPath时Scrapy会提取所有匹配区域的链接并集,无法实现「有footer时仅取footer」的优先级逻辑
调整后的代码
直接使用带优先级判断的XPath即可:
restrict_xpaths = ["//footer[1] | //body[not(//footer)]"]
逻辑说明
这个XPath的匹配规则完全符合你的需求:
- 优先匹配页面内的第一个
<footer>节点,只要页面存在footer,该XPath仅返回footer节点,LinkExtractor只会提取footer区域内的链接 - 当页面不存在任何footer节点时,才会返回
<body>节点,此时LinkExtractor提取整个body区域内的链接
可选优化
如果页面的footer带有特定class/id标识,可以把XPath写得更精准,避免匹配到页面内非全局页脚的footer节点,示例:
# 假设全局页脚的class为page-footer restrict_xpaths = ["//footer[contains(@class, 'page-footer')][1] | //body[not(//footer[contains(@class, 'page-footer')])]"]
内容的提问来源于stack exchange,提问作者IndiaSke
相关产品推荐
相关产品推荐

