为什么我的Python beautifulsoup程序同时出现属性错误,然后同时进行自我修复?

时间:2019-11-28 03:16:34

标签: python beautifulsoup

我一直在使用BeautifulSoup来刮取亚马逊的产品数据。 整个程序一直运行良好,直到出现此错误消息为止

price = soup.find(id="priceblock_ourprice").get_text()

AttributeError:“ NoneType”对象没有属性“ get_text”

执行此操作时,我发现我使用beautifulsoup的每个版本和程序也会出现相同的故障,即使自上次运行以来未更改的版本和程序也是如此。当其中一个再次工作时,它们全部开始工作,直到所有程序再次失败。 这包括我编写的新程序或我尝试的其他程序。 它让我很困惑地重写语法以尝试发现问题,有一次我认为正是头文件的更改使它再次可以正常工作,但随后不久就停止了。

def check_price(URL, headers):

page = requests.get(URL, headers=headers)
soup = BeautifulSoup(page.content, 'html.parser')
price = soup.find(id="priceblock_ourprice").get_text()
converted_price = price[:-3]# -3 removes the .99 pence value from product
float_price = ''
for c in converted_price:
    if c.isdigit():
        float_price = float_price + c
        #loop that removes the £$,. from product so the string can convert to float
return float(float_price)

URl的示例为:https://www.amazon.co.uk/Sony-ILCE7M3B-Mirrorless-Compact-System/dp/B07B4L1PQ8/ref=sr_1_fkmr1_1?keywords=sony+camera+ilce-7m3+6000+alpha&qid=1574887164&sr=8-1-fkmr1

谢谢!

1 个答案:

答案 0 :(得分:0)

根据您的问题:

请注意,AMAZON不允许自动访问其数据!因此,您可以通过检查r.status_code的响应来再次检查!这可能会导致您遇到该错误MSG:

To discuss automated access to Amazon data please contact api-services-support@amazon.com

这就是为什么您的脚本有时可能无法工作的原因。

因此,您可以使用AMAZON API,也可以通过GET将代理列表传递给proxies = list_proxies请求。

我已更正了您的代码中的一些错误,并对其进行了简化。

import requests
from bs4 import BeautifulSoup

headers = {
    'Host': 'www.amazon.co.uk',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'TE': 'Trailers'
}
r = requests.get('https://www.amazon.co.uk/Sony-ILCE7M3B-Mirrorless-Compact-System/dp/B07B4L1PQ8/ref=sr_1_fkmr1_1?keywords=sony+camera+ilce-7m3+6000+alpha&qid=1574887164&sr=8-1-fkmr1', headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
for item in soup.findAll('span', attrs={'class': 'a-size-medium a-color-price priceBlockBuyingPriceString'}):
    item = str(item.text[1:]).split('.')[0]
    print(item)

输出:

1,753

在线测试:Click Here