BS4 (BeautifulSoap) — ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘getText’

#python-2.7 #soap #beautifulsoup

#python-2.7 #soap #beautifulsoup

Вопрос:

Я исследовал здесь, и решения, которые я нашел для своей проблемы, не смогли решить.

Я пытаюсь создать очистку страницы Amazon, которая фиксирует название и цену продукта, но когда я пытаюсь ее запустить, я всегда получаю сообщение об ошибке:

Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘getText’

Что я нахожу странным, так это то, что эта ошибка прерывистая, время работает, и время выдает ошибку, я считаю, что для отображения содержимого для soap есть какой-то другой способ, кроме time.

Я уже пытался использовать time.sleep с несколькими секундами, чтобы попытаться обойти эту проблему, но безуспешно…

Вот выдержка из моего кода:

 import requests
import time
from bs4 import BeautifulSoup
 

def StoreAmazon():

 URL = ['www.amazon.com.br/Notebook-Acer-AN515-54-58CL-Endless-GTX1650/dp/B0883VMXX4?ref_=Oct_s9_apbd_otopr_hd_bw_bHrUqLTamp;pf_rd_r=1ZG49PCAZV8RN8CK6QDQamp;pf_rd_p=ae2a6e14-5e57-57d1-a7c7-38f2deae6a08amp;pf_rd_s=merchandised-search-10amp;pf_rd_t=BROWSEamp;pf_rd_i=16364755011','www.amazon.com.br/Monitor-Gamer-Samsung-LS24D332HSX-ZD/dp/B07MVPD3VK?ref_=Oct_s9_apbd_otopr_hd_bw_bHrUqbbamp;pf_rd_r=D34JDZ7EBFS7CTZ3X5CWamp;pf_rd_p=dfd6eead-be55-57b6-bdaf-226199170f0aamp;pf_rd_s=merchandised-search-10amp;pf_rd_t=BROWSEamp;pf_rd_i=16364756011']

headers = {'User-Agent': 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0'}

for x in range(len(URL)):
    time.sleep(1)
    page = requests.get(URL[x], headers=headers)
    soup = BeautifulSoup(page.content, 'lxml')

    productName  = soup.find('span', {'id':'productTitle'}).getText()
    productPrice = soup.find('span', {'id':'priceblock_ourprice'}).getText()

    print (productName.strip())
    print (productPrice)
    print() 
    # converted_price = float(productPrice[0:5])
    # print (converted_price)

        
 

StoreAmazon ()

Ответ №1:

Я напечатал суп, предоставленный вашим кодом. Amazon обнаружил, что это автоматическая попытка, и предоставил это уведомление

Для обсуждения автоматического доступа к данным Amazon, пожалуйста, свяжитесь с api-services-support@amazon.com . Для получения информации о переходе на наши API-интерфейсы обратитесь к нашим API-интерфейсам Marketplace по адресу https://developer.amazonservices.com/ref=rm_c_sv , или наш Рекламный API продукта на https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html/ref=rm_c_ac для рекламных вариантов использования.

Я все равно мог бы получить его с помощью selenium:

 URL = ['https://www.amazon.com.br/Notebook-Acer-AN515-54-58CL-Endless-GTX1650/dp/B0883VMXX4']

for x in range(len(URL)):
    soup = return_page_source_soup(URL[x])
    # print(soup)
    productName  = soup.find('span', {'class':'product-title-word-break'}).get_text(strip=True)
    print (productName)
 

это мой код для переноса исходного кода из selenium в BeautifulSoup

 from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException

chromeOptions = Options()
chromeOptions.headless = False
PATH = "D:chromedriver.exe"
driver = webdriver.Chrome(PATH, options=chromeOptions)
driver.set_page_load_timeout(20)

def return_page_source_soup(link):
    # pass
    while True:
        try:
            driver.get(link)
        except TimeoutException:
            print("timeout, retrying")
            continue
        else:
            break

    response = driver.page_source
    soup = BeautifulSoup(response,"lxml")
    return soup
 

Примечание 1: Вы вставляете идентификатор ссылки в URL. это не что-то постоянное. вы должны удалить from ?ref из URL.

Примечание 2: у Amazon есть партнерская программа. итак, я не думаю, что вам нужно таким образом извлекать данные из Amazon.