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

