BeautfilSoup возвращает «Нет»

#python-3.x #web-scraping #beautifulsoup

#python-3.x #очистка веб-страниц #beautifulsoup

Вопрос:

Я пытаюсь создать скрипт для отслеживания цен на Amazon. Но я не понимаю, почему это выдает мне эту ошибку :

 Traceback (most recent call last):
  File "scraping_amazon.py", line 12, in <module>
    price = soup.find('span', class_ = 'a-size-medium a-color-price priceBlockBuyingPriceString').text
AttributeError: 'NoneType' object has no attribute 'text'
  

Вот мой сценарий до сих пор :

 import requests
from bs4 import BeautifulSoup

URL = 'https://www.amazon.de/Sony-Vollformat-Digitalkamera-Megapixel-SEL-2870/dp/B00FWUDEEC/ref=sr_1_4?__mk_de_DE=ÅMÅŽÕÑamp;dchild=1amp;keywords=sony a7amp;qid=1604245969amp;quartzVehicle=5-672amp;replacementKeywords=sonyamp;sr=8-4'

page = requests.get(URL)

soup = BeautifulSoup(page.text, 'html.parser')

price = soup.find('span', class_ = 'a-size-medium a-color-price priceBlockBuyingPriceString').text

print(price)
  

Я следовал тому же процессу, что и с другим моим скриптом для создания веб-страниц, они работают, но не он.

Есть идеи? Спасибо.

Ответ №1:

Содержимое страницы динамически загружается с помощью javascript . Вы должны использовать что-то вроде selenium для очистки динамически загружаемых страниц. Вот полный код для этого:

 import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import time
URL = 'https://www.amazon.de/Sony-Vollformat-Digitalkamera-Megapixel-SEL-2870/dp/B00FWUDEEC/ref=sr_1_4?__mk_de_DE=ÅMÅŽÕÑamp;dchild=1amp;keywords=sony a7amp;qid=1604245969amp;quartzVehicle=5-672amp;replacementKeywords=sonyamp;sr=8-4'

driver = webdriver.Chrome()
driver.get(URL)

time.sleep(4)

soup = BeautifulSoup(driver.page_source,'html5lib')

price = soup.find('span', class_ = 'a-size-medium a-color-price priceBlockBuyingPriceString').text

print(price)

driver.close()
  

Вывод:

 962,16 €
  

Комментарии:

1. Файл «scraping_amazon.py «, строка 7, в <module> driver = webdriver. Файл Chrome () «C:UsersEvanAnaconda3libsite-packagesseleniumwebdriverchromewebdriver.py «, строка 73, в файле init self.service.start() «C:UsersEvanAnaconda3libsite-packagesseleniumwebdrivercommonservice.py «, строка 83, в start os.path.basename(self.path), self.start_error_message) selenium.common.exceptions. Исключение WebDriverException: Сообщение: исполняемый файл ‘chromedriver’ должен находиться в PATH. Пожалуйста, посмотрите sites.google.com/a/chromium.org/chromedriver/home

2. Ваш chromedriver должен находиться в том же пути, что и ur script. Если это не тот же путь, тогда вам нужно указать полный путь к файлу webdriver.Chrome() . Вот пример: driver = webdriver.Chrome('D:\Python\chromedriver.exe')

3. Я не знаю, где мой chromedriver. Я никогда не использовал это раньше ^^

4. Хорошо … Если у вас нет chromedriver, загрузите его отсюда: chromedriver.chromium.org/downloads После загрузки поместите его в тот же каталог, что и ur script, и запустите ur script

Ответ №2:

Используйте HTMLsession с некоторым фиктивным пользовательским агентом

 from bs4 import BeautifulSoup
from requests_html import HTMLSession
headers = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'
}
session = HTMLSession()
response = session.get('https://www.amazon.de/Sony-Vollformat-Digitalkamera-Megapixel-SEL-2870/dp/B00FWUDEEC/ref=sr_1_4?__mk_de_DE=ÅMÅŽÕÑamp;dchild=1amp;keywords=sony a7amp;qid=1604245969amp;quartzVehicle=5-672amp;replacementKeywords=sonyamp;sr=8-4',headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')

price = soup.find('span', class_ = 'a-size-medium a-color-price priceBlockBuyingPriceString').text

print(price)
  

Комментарии:

1. Я пробовал использовать user agent раньше, но это не сработало :/

2. @LaurieFalcon Это работает для меня repl.it/repls/ParallelScratchyDisc