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

Scrapy中LinkExtractor处理XPath结果报SelectorList不可哈希错误如何解决

你遇到的报错是因为LinkExtractor.extract_links()方法只接收Response类的实例作为入参,你传入的是XPath查询返回的SelectorList类型,因此触发类型错误。有两种可行的实现方案:

方案1:使用LinkExtractor内置范围限定(推荐)

LinkExtractor原生支持通过restrict_xpaths参数指定提取链接的节点范围,无需提前手动做XPath筛选,改后代码如下:

import scrapy
from scrapy.linkextractors import LinkExtractor

class YahooSpider(scrapy.Spider):
    name = 'yahoo'
    allowed_domains = ['news.yahoo.com']
  
    def start_requests(self):
        urls = ['https://news.yahoo.com/search?p=%E6%97%A5%E6%9C%AC%E3%83%8F%E3%83%A0&ei=utf-8']
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        # 初始化时指定仅在class包含contentsWrap的div节点下提取链接
        xlink = LinkExtractor(restrict_xpaths="//div[contains(@class,'contentsWrap')]")
        for link in xlink.extract_links(response): 
            print("GETLINK:{0}".format(link))

这种是Scrapy官方推荐的标准用法,性能最优、代码最简洁。

方案2:手动处理筛选后的Selector节点

如果你确实需要先完成XPath逻辑再提取链接,可以遍历SelectorList中的每个节点,构造临时Response对象后再调用链接提取方法:

def parse(self, response):
    xlink = LinkExtractor()
    contents = response.xpath("//div[contains(@class,'contentsWrap')]")
    
    for node in contents:
        # 提取当前节点的HTML内容构造临时响应对象
        tmp_response = scrapy.http.HtmlResponse(
            url=response.url,
            body=node.extract(),
            encoding='utf-8'
        )
        for link in xlink.extract_links(tmp_response):
            print("GETLINK:{0}".format(link))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:02