Scrapy LinkExtractor使用restrict_text报错,如何提取谷歌搜索Next链接?
解决Scrapy LinkExtractor的
restrict_text参数错误问题 嘿,这个错误原因很明确——restrict_text根本不是LinkExtractor类的合法初始化参数,所以Scrapy才会抛出那个TypeError。要提取谷歌搜索结果里带"Next"文本的链接,我们可以换两种正确的方式来实现:
方案一:先提取链接,再手动筛选文本
先通过restrict_xpaths定位到目标区域的链接,之后再用列表推导式筛选出文本包含"Next"的链接:
from scrapy.linkextractors import LinkExtractor # 初始化LinkExtractor,只限定xpath区域 le = LinkExtractor(restrict_xpaths='//td[@class="b navend"]') # 提取该区域内的所有链接 all_links = le.extract_links(response) # 筛选出文本包含"Next"的链接(strip()去掉多余空格,避免匹配失败) next_links = [link for link in all_links if 'Next' in link.text.strip()]
方案二:用process_links参数实时过滤
你还可以借助LinkExtractor的process_links参数,传入一个自定义过滤函数,在提取链接的同时就完成文本筛选:
from scrapy.linkextractors import LinkExtractor # 定义过滤函数,只保留文本含"Next"的链接 def filter_next_only(links): return [link for link in links if 'Next' in link.text.strip()] # 初始化时传入过滤函数 le = LinkExtractor(restrict_xpaths='//td[@class="b navend"]', process_links=filter_next_only) # 直接得到符合要求的链接 next_links = le.extract_links(response)
额外提示:注意谷歌页面结构变化
另外要提醒你,谷歌的搜索页面结构经常会更新,你用的//td[@class="b navend"]这个xpath可能已经失效了。当前谷歌的下一页链接通常在//a[@id="pnnext"]这个元素里,你可以先在Scrapy Shell里用response.xpath('//a[@id="pnnext"]')验证一下是否能定位到目标元素。
内容的提问来源于stack exchange,提问作者programmerwiz32
相关产品推荐
相关产品推荐

