我想在线获取特定文章的价格,但似乎无法获取标签下的元素,但我可以在网站的另一个(不同)站点上执行此操作。在这个特定的站点中,我只得到一个空列表。打印 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 来呈现您尝试获取的数据。问题是requests没有评估 javascript。
requests
您说得也对,Selenium WebDriver 经常用于这些情况,因为它可以驱动真正的、功能齐全的浏览器实例。但它并不是唯一的选择,因为它requests-html支持 JavaScript,并且对于简单的抓取来说可能不那么麻烦。
requests-html
作为入门示例,以下内容获取您所访问网站上前五件商品的标题和价格:
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