在CoinDesk抓取比特币文章封面URL,XPath返回重复结果如何解决?
解决CoinDesk封面图URL重复抓取的问题
原因分析
你遇到的重复问题,大概率是每个img-block容器里存在两个<img>标签(比如用于适配不同设备的分辨率图、或者隐藏的备用图),你的XPath匹配到了所有符合条件的img,所以10个容器返回20条结果。
三种解决办法
优化XPath精准定位
直接指定每个img-block下的第一个img,或者只匹配直接子节点的img,避免抓取到嵌套的冗余img://div[@class="img-block"]//img[1]/@src或者如果每个
img-block只有一个直接子img,用更简洁的路径://div[@class="img-block"]/img/@src要是页面里的主图有特定属性(比如class、loading属性),还可以进一步缩小范围,比如:
//div[@class="img-block"]//img[@loading="lazy"]/@src提取结果后去重
如果不想调整XPath,也可以在获取到结果列表后做去重处理。以Python为例,要保留原顺序的话用dict.fromkeys,不需要顺序的话用集合:# 假设已经通过XPath获取到src列表 raw_srcs = response.xpath('//div[@class="img-block"]//img/@src').getall() # 保留顺序的去重 unique_srcs = list(dict.fromkeys(raw_srcs)) # 不关心顺序的话用集合 # unique_srcs = list(set(raw_srcs))定位文章容器再取图
先定位每篇文章的根容器,再从每个容器里取封面图,确保每个文章只取一次://article//div[@class="img-block"]//img/@src这样先锁定每篇文章的范围,再抓取对应封面,从根源避免重复。
内容的提问来源于stack exchange,提问作者hareko
相关产品推荐
相关产品推荐

