Scrapy XPath查询返回<li>列表但仅重复首个元素的问题求助
问题原因与解决办法
核心问题
你循环里写的//@data-lurker_list_id这类XPath表达式,是从整个文档的根节点开始搜索的,所以每次都会返回文档里第一个匹配的属性值,自然所有循环项都重复第一个元素的数据。
修复代码
把XPath表达式改成相对路径,在开头加个.,表示从当前item节点的上下文里查找:
def parse(self, response): # 别用list当变量名,这是Python内置类型,容易出问题 ad_links = response.xpath('//ul[@id="ad-list"]/li//a[@data-ds-component="DS-Link"]') for item in ad_links: newItem = Item() # 每次循环都要新建Item实例,不然会覆盖之前的数据 newItem["product_id"] = item.xpath('.//@data-lurker_list_id').get() newItem["url"] = item.xpath('.//@href').get() newItem["title"] = item.xpath('.//@title').get() # 记得yield或者处理这个newItem,不然数据没输出 yield newItem
额外提醒
- 避免用
list作为变量名,会覆盖Python自带的list类型,引发不必要的bug。 - 必须在循环内创建
Item实例,如果在循环外创建,后续赋值会修改同一个对象,最后所有结果都会变成最后一次循环的数据。
内容的提问来源于stack exchange,提问作者Breno Rios Ramos
相关产品推荐
相关产品推荐

