如何让汤解析不同风格的亚马逊网页

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)

【讨论】:

以上是关于如何让汤解析不同风格的亚马逊网页的主要内容,如果未能解决你的问题,请参考以下文章

尽管网页没有改变,Python程序抓取不同的文本

亚马逊商城书城如何购买电子书

[当尝试解析亚马逊产品时,我的请求有时会重定向到其他页面

今天亚马逊网页打不开,打开之后还没有图片,网页特别不完整,为啥

怎样快速保存网页版亚马逊的商品主图视频?

家里的移动宽带上不去美国亚马逊的网页