使用Scrapy提取eBay商品详情多字段无数据该如何解决?
问题修复方案
核心错误原因
- 调用
.get()方法获取data_cards时,返回的是匹配节点的HTML字符串,而非可继续执行xpath查询的选择器对象,后续遍历字符串时迭代的是单个字符,完全无法匹配节点路径,自然拿不到任何数据。 - 循环内部重新实例化了
ItemLoader,直接覆盖了从列表页传递过来、已经填充了name/price等字段的loader对象,不仅会丢失原有列表页采集的数据,新实例的loader也因为selector是无效的字符对象无法提取字段。 - 单个商品详情页内
tab-content-m节点通常只有一个,不需要循环遍历,直接用该节点作为上下文提取字段即可。
修正后代码
def parse_product_details(self, response, loader): # 移除.get(),直接获取详情内容节点选择器 data_card = response.xpath('//div[@class="tab-content-m"]') # 复用传入的loader,将查询上下文切换到详情内容节点 loader.selector = data_card loader.add_xpath('condition','.//div[@class="ux-layout-section__row"][3]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()') loader.add_xpath('character','.//div[@class="ux-layout-section__row"][1]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()') loader.add_xpath('rarity','.//div[@class="ux-layout-section__row"][8]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()') loader.add_xpath('graded','.//div[@class="ux-layout-section__row"][4]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()') loader.add_xpath('set','.//div[@class="ux-layout-section__row"][1]/div[@class="ux-labels-values__values"][1]/div[@class="ux-labels-values__values-content"]/div/span//text()') yield loader.load_item()
可选优化建议
现有xpath强依赖节点顺序,稳定性差,建议改写成按标签文本匹配的写法,比如提取condition可以先定位到文本为"Condition:"的标签,再取相邻的value值,不容易因为页面结构调整失效。
内容的提问来源于stack exchange,提问作者me.limes
相关产品推荐
相关产品推荐

