gpt4 book ai didi

python - Beautiful Soup 4 findall() 不匹配 标签中的元素

转载 作者:太空宇宙 更新时间:2023-11-03 13:54:59 26 4
gpt4 key购买 nike

我正在尝试使用 Beautiful Soup 4 来帮助我从 Imgur 下载图像,尽管我怀疑 Imgur 部分是否相关。例如,我在这里使用网页:https://imgur.com/t/lenovo/mLwnorj

我的代码如下:

import webbrowser, time, sys, requests, os, bs4      # Not all libraries are used in this code snippet
from selenium import webdriver

browser = webdriver.Firefox()
browser.get("https://imgur.com/t/lenovo/mLwnorj")

res = requests.get(https://imgur.com/t/lenovo/mLwnorj)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, features="html.parser")

imageElement = soup.findAll('img', {'class': 'post-image-placeholder'})
print(imageElement)

Imgur 链接上的 HTML 代码包含如下部分:

<img alt="" src="//i.imgur.com/JfLsH5y.jpg" class="post-image-placeholder" style="max-width: 100%; min-height: 546px;" original-title="">

这是我通过使用 Inspect Element 中的点击工具选择页面上的第一个图像元素找到的。

问题是我希望 imageElement 中有两个项目,每个图像一个,但是打印函数显示 []。我还尝试了其他形式的 soup.findAll('img', {'class': 'post-image-placeholder'}) 例如 soup.findall("img[class= 'post-image-placeholder']") 但这没有区别。

此外,当我使用

imageElement = soup.select("h1[class='post-title']")

,只是为了测试,打印函数确实返回了一个匹配项,这让我怀疑它是否与标签有关。

[<h1 class="post-title">Cable management increases performance. </h1>]

感谢您的时间和努力

最佳答案

这里的根本问题似乎是实际的 <img ...>首次加载页面时元素不存在。在我看来,最好的解决方案是利用您已有的 selenium webdriver 来抓取图像。 Selenium 将允许页面正确呈现(使用 JavaScript 和所有),然后找到您关心的任何元素。

例如:

import webbrowser, time, sys, requests, os, bs4      # Not all libraries are used in this code snippet
from selenium import webdriver

# For pretty debugging output
import pprint


browser = webdriver.Firefox()
browser.get("https://imgur.com/t/lenovo/mLwnorj")

# Give the page up to 10 seconds of a grace period to finish rendering
# before complaining about images not being found.
browser.implicitly_wait(10)

# Find elements via Selenium's search
selenium_image_elements = browser.find_elements_by_css_selector('img.post-image-placeholder')
pprint.pprint(selenium_image_elements)

# Use page source to attempt to find them with BeautifulSoup 4
soup = bs4.BeautifulSoup(browser.page_source, features="html.parser")

soup_image_elements = soup.findAll('img', {'class': 'post-image-placeholder'})
pprint.pprint(soup_image_elements)

我不能说我已经在我这边测试了这段代码, 但一般概念应该可行。


更新:

我继续在我这边进行测试,修复了代码中的一些错误,然后我得到了我希望看到的结果:

Output from running code

关于python - Beautiful Soup 4 findall() 不匹配 <img> 标签中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57639976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com