我正在尝试使用以下脚本从网页上抓取图像链接,但是当我运行它时,脚本会从那里获取两个链接(两次相同的链接)。为什么我会得到如此奇怪的结果?
我需要维护列表理解的格式,因为很少有页面可以看到多个图像链接。但是,我也不希望使用set()
来踢掉那些重复的图像链接。使用选择器时哪里出问题了?
这是我的尝试:
import requests
from bs4 import BeautifulSoup
url = "check_out_the_link_above"
def get_image_links(s,link):
s.headers["User-Agent"] = "Mozilla/5.0"
res = s.get(link)
soup = BeautifulSoup(res.text,"lxml")
images = [item.get("src") for item in soup.select("img.dp-gallery__image")]
print(images)
if __name__ == '__main__':
with requests.Session() as s:
get_image_links(s,url)
我得到的结果:
['https://lid.zoocdn.com/645/430/f8eaf79c39145242e9a30e8d550972e07c0d15a1.jpg', 'https://lid.zoocdn.com/645/430/f8eaf79c39145242e9a30e8d550972e07c0d15a1.jpg']
一个我不想的链接两次。
答案 0 :(得分:1)
有两个相同的图像:第一个位于noscript
节点内并且隐藏,第二个可见。
最好的方法是使用XPath //img[@class="dp-gallery__image" and not(ancestor::noscript)]
,但是由于bs4不支持XPath,因此可以尝试CSS选择器
ul > li > img.dp-gallery__image
答案 1 :(得分:0)
源网站在同一类中有两次图片链接。
<noscript>
<li class="dp-gallery__list-item dp-gallery__list-item--orphan">
<img src="https://lid.zoocdn.com/645/430/f8eaf79c39145242e9a30e8d550972e07c0d15a1.jpg" class="dp-gallery__image" alt="Swale Avenue, Peterborough, Cambridgeshire. PE4">
</li>
</noscript>
<li class="dp-gallery__list-item dp-gallery__list-item--orphan">
<img src="https://lid.zoocdn.com/645/430/f8eaf79c39145242e9a30e8d550972e07c0d15a1.jpg" class="dp-gallery__image" alt="Swale Avenue, Peterborough, Cambridgeshire. PE4">
</li>
如果您想避免第二个,我会在搜索中添加另一个过滤器,以确保仅得到其中一个。
假设内存不是一个大问题,那么更简单的解决方案就是拍摄图像[0]。