如何让汤解析不同风格的亚马逊网页
Posted
技术标签:
【中文标题】如何让汤解析不同风格的亚马逊网页【英文标题】:How to allow soup to parse different style Amazon webpages 【发布时间】:2019-10-27 02:16:38 【问题描述】:我正在使用不同风格的亚马逊页面测试我的代码,但它无法解析某种风格的页面。它适用于 1 种类型的页面,但不适用于将不同选项显示为选项卡的页面。
import bs4, requests
header = 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/41.0.2228.0 Safari/537.6',
goodRes = requests.get('https://www.amazon.com/Automate-Boring-Stuff-Python-Programming/dp/1593275994/', headers=header)
goodRes2 = requests.get('https://www.amazon.com/gp/product/1593277954/', headers=header)
badRes = requests.get('https://www.amazon.com/Automate-Boring-Stuff-Python-Programming-ebook/dp/B00WJ049VU/', headers=header)
soup = bs4.BeautifulSoup(goodRes.text, 'lxml') # change to badRes for error
price = soup.select('.offer-price')
name = soup.select('#productTitle')
author = soup.select('.contributorNameID')
print(name[0].text.strip())
print(author[0].text.strip())
print(price[0].text.strip())
前两个 URL(goodRes 和 goodRes2)是电子书的直接链接,它们由 get 检索,并由 soup 解析以获得我需要的正确信息。
第三个 URL 是前面提到的“选项卡式”样式页面,即使 get 请求有效,soup 也找不到给定 CSS 选择器的任何内容(即使它们在此选项卡式页面上完全相同)。这会在执行第一个打印函数时产生“列表索引超出范围”错误。
我不确定如何修改它以解析来自 badRes URL 的信息。
任何帮助表示赞赏。谢谢。
【问题讨论】:
【参考方案1】:根据您的选择器,并非所有页面都存在相同的元素。另外,我注意到第二个链接是 Kindle 和平装本,而不是电子书,列出;虽然我猜电子书和kindle是可以互换的。我使用 Or css 语法来处理不同的属性值。例如,对于书名,您可以使用 #productTitle, #ebooksProductTitle
作为 ID。
在 bs4 4.7.1 中,您可以使用 :has
和 :contains
伪类通过与其他元素的关系来定位价格
import bs4, requests
header = 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.6',
urls = ['https://www.amazon.com/Automate-Boring-Stuff-Python-Programming/dp/1593275994/', 'https://www.amazon.com/gp/product/1593277954/', 'https://www.amazon.com/Automate-Boring-Stuff-Python-Programming-ebook/dp/B00WJ049VU/']
with requests.Session() as s:
for url in urls:
r = s.get(url, headers=header)
soup = bs4.BeautifulSoup(r.text, 'lxml')
price = soup.select_one('span:has(span:contains("eTextbook"), span:contains("Kindle")) .a-size-base').text.strip()
author = soup.select_one('.contributorNameID').text
title = soup.select_one('#productTitle, #ebooksProductTitle').text.strip()
print(title, author, price)
【讨论】:
以上是关于如何让汤解析不同风格的亚马逊网页的主要内容,如果未能解决你的问题,请参考以下文章