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

问题描述 投票:1回答:1

我想在网上得到一篇特定文章的价格,我似乎无法将该元素置于标签下,但我可以在该网站的另一个(不同的)网站上进行。在这个特定的网站中,我只得到一个空列表。打印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(我可以开展工作),但我不知道为什么。我发现它更不实用。

此外,我有没有机会读到该网站正在使用javascript来获取此结果。如果是这种情况,为什么我可以在https://reverb.com/price-guide/effects-and-pedals中获取数据但不在这里?在这种情况下,Selenium会是唯一的解决方案吗?

python web-scraping beautifulsoup python-requests
1个回答
3
投票

您说明的是,您定位的网站依赖于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
© www.soinside.com 2019 - 2024. All rights reserved.