小能豆

为什么 BeautifulSoup 在搜索结果网站上返回空列表?

py

我想在线获取特定文章的价格,但似乎无法获取标签下的元素,但我可以在网站的另一个(不同)站点上执行此操作。在这个特定的站点中,我只得到一个空列表。打印 soup.text 也可以。如果可能的话,我不想使用 Selenium,因为我想了解 BS4 如何处理这种情况。

import requests
from bs4 import BeautifulSoup
url = 'https://reverb.com/p/electro-harmonix-oceans-11-reverb-2018'

r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
cards = soup.select(".product-row-card")
print (cards)
>>>[]

我想在网站上获取卡片的名称和价格。我以前也遇到过这个问题,但这里的每个解决方案都只建议使用 Selenium(我可以让它工作),但我不知道为什么。我觉得这更不实用。


阅读 14

收藏
2025-01-09

共1个答案

小能豆

您说得对,您定位的网站依赖 javascript 来呈现您尝试获取的数据。问题是requests没有评估 javascript。

您说得也对,Selenium WebDriver 经常用于这些情况,因为它可以驱动真正的、功能齐全的浏览器实例。但它并不是唯一的选择,因为它requests-html支持 JavaScript,并且对于简单的抓取来说可能不那么麻烦。

作为入门示例,以下内容获取您所访问网站上前五件商品的标题和价格:

from requests_html import HTMLSession
from bs4 import BeautifulSoup

session = HTMLSession()
r = session.get("https://reverb.com/p/electro-harmonix-oceans-11-reverb-2018")
r.html.render(sleep=5)

soup = BeautifulSoup(r.html.raw_html, "html.parser")
for item in soup.select(".product-row-card", limit=5):
    title = item.select_one(".product-row-card__title__text").text.strip()
    price = item.select_one(".product-row-card__price__base").text.strip()
    print(f"{title}: {price}")

结果:

Electro-Harmonix EHX Oceans 11 Eleven Reverb Hall Spring Guitar Effects Pedal: $119.98
Electro-Harmonix Oceans 11 Reverb - Used: $119.99
Electro-Harmonix Oceans 11 Multifunction Digital Reverb Effects Pedal: $122
Pre-Owned Electro-Harmonix Oceans 11 Reverb Multi Effects Pedal Used: $142.27
Electro-Harmonix Oceans 11 Reverb Matte Black: $110
2025-01-09