python - 使用 BeautifulSoup 进行网页抓取只能获取一半的项目
问题描述
我正在尝试从此页面获取所有文章标题。
我想要的所有 84 个项目都具有相同的类名:
“cat_brandName-2XZRz cat_ellipsis-MujnT”
这是我的代码
from bs4 import BeautifulSoup
import urllib
url = "https://www.zalando.nl/herenschoenen/"
soep = BeautifulSoup(urllib.request.urlopen(url).read(), 'lxml')
#trying to get all objects with the article tag, which should be 84 items.
articles = (soep.body.find_all("article"))
for x in articles:
try:
print(x.find(class_="cat_brandName-2XZRz cat_ellipsis-MujnT").get_text())
except:
continue
但结果只给了我 84 项中的 35 项:
Nike Sportswear
Nike Sportswear
Nike Performance
Nike Performance
adidas Originals
Nike Sportswear
Clarks Originals
Nike Sportswear
Nike Performance
Nike Sportswear
Nike Sportswear
Nike Sportswear
Puma
Lacoste
Clarks Originals
Vans
Nike Performance
Birkenstock
adidas Originals
adidas Originals
Reef
adidas Originals
New Balance
Nike SB
Levi's®
adidas Originals
Lacoste
Tommy Hilfiger
New Balance
Reebok Classic
Bugatti
Birkenstock
当我将网页作为 Chrome HTML 文档保存到我的设备并在我的代码中使用它时,它可以工作并且我得到所有文章标题。
但是我不想下载这些页面,并且可能有一种使用 urllib 的方法。(使用 requests.get() 这是同样的问题)
解决方案
使用 API 可能是解决它的最佳方法,但是您也可以在 的帮助下做到这一点selenium
。你没有得到所有结果的原因是你第一次打开网页时没有加载网页中的所有内容。确保您安装了 chromium webdriver 并将其放在您的路径中。
from selenium import webdriver
from bs4 import BeautifulSoup
url = "https://www.zalando.nl/herenschoenen/"
driver = webdriver.Chrome(driverPath)
driver.get(url)
html_content = driver.execute_script('return document.body.innerHTML')
soep = BeautifulSoup(html_content, 'lxml')
articles = (soep.body.find_all("article"))
for x in articles:
try:
print(x.find(class_="cat_brandName-2XZRz cat_ellipsis-MujnT").get_text())
except:
continue
推荐阅读
- r - 我有一个包含 html 代码的文本文件。这会在导入时导致错误
- azure - 无法使用“az”向 Azure AD 中的应用授予权限;得到一个 403
- javascript - 如何在 REACT js 的 .map() 函数中仅禁用选定的按钮 onClick
- r - 为什么这个闪亮的应用程序不起作用?
- sml - 模式匹配冲突
- python - pytest 只执行模块/文件中定义的最后一个测试
- python - 无法在 Pyinstaller 的 exe 中使用 lightgbm.dll
- jenkins - 如何在 Jenkinsfile 中打印出类属性的值?
- qt - Windows-10-Qt-quick-QML代码是否与IOS交叉兼容
- ajax - 如何测试我的视图文件中定义的 AJAX 函数?