为何Scrapy中编写的XPath返回大量重复结果?
XPath返回重复结果的原因解析
问题出在XPath路径的写法上:
- 你先通过
response.xpath('//div[@class="quote"]')获取了所有class为quote的div节点集合。 - 但后续调用
result.xpath('//span[@class="text"]/text()')时,开头的//是绝对路径——它会忽略当前的result节点集合,直接从整个HTML文档的根节点重新检索所有符合条件的span标签。也就是说,每遍历一个div节点,就会把页面上所有class为text的span都取一次,最终结果自然会出现大量重复(重复次数等于div节点的数量)。
而CSS选择器默认是基于当前节点做相对查找的,比如result.css('.text::text')会自动在每个div.quote节点的子节点范围内检索,所以结果正常。
要解决这个问题,只需要把第二次的XPath改成相对路径,在开头加上.,表示从当前节点开始向下查找:
result.xpath('.//span[@class="text"]/text()')
这样就能在每个div.quote节点下正确找到对应的span文本,得到无重复的结果。
内容的提问来源于stack exchange,提问作者Edmounds
相关产品推荐
相关产品推荐

