首页 > 解决方案 > 使用 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() 这是同样的问题)

标签: pythonweb-scrapingbeautifulsoup

解决方案


使用 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

推荐阅读