Получение ошибки в BS4 во время утилизации в Amazon: AttributeError: у объекта 'NoneType' нет атрибута 'get_text' - PullRequest
0 голосов
/ 18 февраля 2020
!pip install requests
!pip install bs4


import requests
from bs4 import BeautifulSoup

url = "https://www.amazon.in/Apple-iPhone-Pro-Max-256GB/dp/B07XVLH744/ref=sr_1_1_sspa?crid=2VCKZNOH3H6SR&keywords=apple+iphone+11+pro+max&qid=1582043410&sprefix=apple+iphone%2Caps%2C388&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyVjdZSE83TzU4UUMmZW5jcnlwdGVkSWQ9QTAyNTI1ODZJUzZOVUwxWDNIUlAmZW5jcnlwdGVkQWRJZD1BMDkxNDg4MzFLMFpVT1M5OFM5Q0smd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl"

headers = {"User-Agent": "in this section im adding my user agent after typing my user agent in google search"}

page = requests.get(url, headers=headers)

soup = BeautifulSoup(page.content, "html.parser")

print(soup.prettify()) 

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

converted_price = price[0:8]

print(converted_price)
print(titles)

Я работаю над Google Colab, когда я запускаю этот код, я получаю эту ошибку

AttributeError   Traceback (most recent call last)
<ipython-input-15-14696d9dc778> in <module>()
     16 print(soup.prettify())
     17 
---> 18 title = soup.find(id = "productTitle").get_text()
     19 price = soup.find(id = "priceblock_ourprice").get_text()
     20 

AttributeError: 'NoneType' object has no attribute 'get_text'

Я попытался выполнить поиск по всему inte rnet, но не нашел ответа на мой вопрос. Я пытаюсь получить максимальную цену iPhone 11. когда я запускаю этот код, я получаю ошибку, упомянутую выше.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

Вы получаете эту ошибку, когда пытаетесь извлечь данные из объекта со значением None. Если вы видите это в строке 18, это означает, что ваш soup.find(id = "productTitle") не соответствует чему-либо и вернул None.

Вам необходимо разбить обработку на этапы. Проверьте возвращаемое значение, прежде чем получить к нему доступ. Итак ...

title_info = soup.find(id = "productTitle")
if title_info:
    title = title_info.text
else:
    'handle the situation'
0 голосов
/ 18 февраля 2020

Ну, я проверил ваш код здесь, он работает нормально. Однако Amazon дает вам код 503, когда вы пытаетесь получить доступ к той же ссылке в течение короткого времени ...

<html>
 <head>
  <title>
   503 - Service Unavailable Error
  </title>
 </head>
 <body bgcolor="#FFFFFF" text="#000000">
  <!--
        To discuss automated access to Amazon data please contact api-services-support@amazon.com.
        For information about migrating to our APIs refer to our Marketplace APIs at https://developer.amazonservices.in/ref=rm_5_sv, or our Product Advertising API at https://affiliate-program.amazon.in/gp/advertising/api/detail/main.html/ref=rm_5_ac for advertising use cases.
-->
  <center>
   <a href="https://www.amazon.in/ref=cs_503_logo/">
    <img alt="Amazon.in" border="0" height="45" src="https://images-eu.ssl-images-amazon.com/images/G/31/x-locale/communities/people/logo.gif" width="200"/>
   </a>
   <p align="center">
    <font face="Verdana,Arial,Helvetica">
     <font color="#CC6600" size="+2">
      <b>
       Oops!
      </b>
     </font>
     <br/>
     <b>
      It's rush hour and traffic is piling up on that page. Please try again in a short while.
      <br/>
      If you were trying to place an order, it will not have been processed at this time.
     </b>
     <p>
      <img alt="*" border="0" height="9" src="https://images-eu.ssl-images-amazon.com/images/G/02/x-locale/common/orange-arrow.gif" width="10"/>
      <b>
       <a href="https://www.amazon.in/ref=cs_503_link/">
        Go to the Amazon.in home page to continue shopping
       </a>
      </b>
     </p>
    </font>
   </p>
  </center>
 </body>
</html>

Подождите некоторое время, прежде чем вы сможете повторить попытку, или хотя бы протестируйте с более длительным временем между запросами ...

0 голосов
/ 18 февраля 2020
  • soup.find(id = "productTitle") Возвращается None, поскольку не удается найти id = "producTitle". Убедитесь, что вы ищете правильный элемент.

  • Для find операторов я бы предложил всегда писать, если условие, чтобы избежать и обрабатывать ошибки такого рода.

title = soup.find(id = "productTitle")
if title:
    title = title.get_text()
else:
    title = "default_title"

price = soup.find(id = "priceblock_ourprice").get_text()
  • вы можете сделать то же самое с price.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...