【问题标题】:Unable to extract item title in Amazon无法在亚马逊中提取商品标题
【发布时间】:2019-12-26 07:05:34
【问题描述】:

当我尝试使用下面的代码知道Sony Headset 的标题时,代码的结果是None

import requests    
from bs4 import BeautifulSoup

URL = 'https://www.amazon.com/Sony-Noise-Cancelling-Headphones- 
       WH1000XM3/dp/B07G4MNFS1/ref=sxin_0_ac_d_rm?ac_md=0-0-c29ueQ%3D%3D- 
       ac_d_rm&keywords=sony&pd_rd_i=B07G4MNFS1&pd_rd_r=3e6d5325-8ee4-4ba8-a84f- 
       1b7cf2ce98bf&pd_rd_w=BVSFq&pd_rd_wg=I0LMZ&pf_rd_p=e2f20af2-9651-42af-9a45- 
       89425d5bae34&pf_rd_r=VGT25BXXZNDE3B61A994&psc=1&qid=1577253649&smid=ATVPDKIKX0DER'

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like 
Gecko) Chrome/79.0.3945.88 Safari/537.36"}

page = requests.get(URL, headers=headers)    
soup = BeautifulSoup(page.content, "html.parser")
soup.prettify()

#print(soup)

title = soup.find_all('span', {'id':'productTitle'})                        

print(title, len(title))   

当前输出为:

[ ] 0

【问题讨论】:

  • "productTitle" 是 ID,而不是类:soup.find("span", {"id": "productTitle"})
  • 即使我写的是 id 而不是 class ,它会显示 0 [ ] 相同的结果

标签: python-3.x web-scraping beautifulsoup python-requests web-crawler


【解决方案1】:

我花了两个小时试图用 BeautifulSoup 刮掉这个标题。我尝试抓取页面上的其他元素。没有成功。我尝试将原始内容发送到文件,但由于存在奇怪的字符而中断。

我尝试了 Ahmed 的答案,但仍然没有。我尝试了一堆我在网上找到的其他解决方案,但仍然没有。我一辈子都想不出如何使用BeautifulSoup 来刮这个。

我知道您使用 Selenium,所以这里是 Selenium 解决方案。

from selenium import webdriver
bot = webdriver.Chrome()
bot.get("https://www.amazon.com/Sony-Noise-Cancelling-Headphones-WH1000XM3/dp/B07G4MNFS1/ref=sxin_0_ac_d_rm?ac_md=0-0-c29ueQ==-ac_d_rm&keywords=sony&pd_rd_i=B07G4MNFS1&pd_rd_r=3e6d5325-8ee4-4ba8-a84f-1b7cf2ce98bf&pd_rd_w=BVSFq&pd_rd_wg=I0LMZ&pf_rd_p=e2f20af2-9651-42af-9a45-89425d5bae34&pf_rd_r=VGT25BXXZNDE3B61A994&psc=1&qid=1577253649&smid=ATVPDKIKX0DER")
title = bot.find_element_by_id('productTitle').text
print(title)
bot.close()

【讨论】:

  • @Xosrov 评论工作正常。只需添加一个用户代理标头并使用 find 或 select_one 返回单个节点和 .text 以提取实际的标记值。
  • @Matthew Gaiser 非常感谢您抽出宝贵的时间来支持我解决这个问题,如果您喜欢 SONY wh-1000,圣诞快乐会送给您。
【解决方案2】:
import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.amazon.com/Sony-Noise-Cancelling-Headphones-WH1000XM3/dp/B07G4MNFS1/ref=sxin_0_ac_d_rm?ac_md=0-0-c29ueQ==-ac_d_rm&keywords=sony&pd_rd_i=B07G4MNFS1&pd_rd_r=3e6d5325-8ee4-4ba8-a84f-1b7cf2ce98bf&pd_rd_w=BVSFq&pd_rd_wg=I0LMZ&pf_rd_p=e2f20af2-9651-42af-9a45-89425d5bae34&pf_rd_r=VGT25BXXZNDE3B61A994&psc=1&qid=1577253649&smid=ATVPDKIKX0DER")
soup = BeautifulSoup(r.text, 'html.parser')

for item in soup.findAll("span", {'id': 'productTitle'}):
    print(item.get_text(strip=True))

输出:

Sony Noise Cancelling Headphones WH1000XM3: Wireless Bluetooth Over the Ear Headphones with Mic and Alexa voice control - Industry Leading Active Noise Cancellation - Black

在线运行代码:Click Here

【讨论】:

  • 你也可以从metatitle = soup.find_all('meta', {'name': 'title'})得到if
  • @Xosrov 你应该知道通过JavaScript 渲染的<script> 标记和普通元素之间的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多