Scrapy ItemLoader使用问题:CSS/XPath提取投票数据失败求助
Scrapy ItemLoader提取数据为空问题解决指南
两种提取方式的适用场景
- 提取进度条的
value属性:优先用CSS选择器,语法更简洁,例如progress[class*="rating"]::attr(value) - 提取嵌套div&span的文本:XPath更适合复杂嵌套结构,例如
//div[@class="target-container"]/span/text()
空结果的常见排查点及解决方法
初始化ItemLoader时遗漏response参数
必须传入response才能让Loader解析页面内容,正确初始化方式:from scrapy.loader import ItemLoader from your_project.items import PerfumeItem def parse(self, response): loader = ItemLoader(item=PerfumeItem(), response=response) # 后续添加提取规则选择器依赖动态渲染内容
浏览器调试工具看到的元素可能是JS动态生成的,而Scrapy获取的是原始HTML:- 用
view(response)命令查看Scrapy实际获取的页面源码,确认目标元素存在 - 更换为基于静态结构的选择器,避免使用动态生成的class或id
- 用
未调用
load_item()方法
添加完提取规则后,必须调用该方法才能生成填充好的Item对象:# 添加提取规则 loader.add_css('rating', 'progress.rating-progress::attr(value)') loader.add_xpath('vote_count', '//div[@class="vote-count"]/span/text()') # 生成Item并返回 item = loader.load_item() yield item选择器匹配范围过大或定位错误
如果目标元素在特定容器内,可先定位容器再缩小提取范围:container = response.xpath('//div[@class="perfume-details"]') loader = ItemLoader(item=PerfumeItem(), selector=container)
针对目标页面的示例代码
def parse(self, response): loader = ItemLoader(item=PerfumeItem(), response=response) # 提取进度条value属性 loader.add_css('rating', 'progress[class^="rating"]::attr(value)') # 提取嵌套span的文本数据 loader.add_xpath('vote_count', '//div[@class="voteCount"]/span/text()') yield loader.load_item()
内容的提问来源于stack exchange,提问作者Igor V
相关产品推荐
相关产品推荐

