BeautifulSoup с помощью Python продолжает возвращать ноль, даже если элемент существует - PullRequest
1 голос
/ 13 января 2020

Я запускаю следующий код для разбора страницы amazon, используя красивый суп в Python, но когда я запускаю строку печати, я получаю None. Мне интересно, делаю ли я что-то не так или есть объяснение / решение этого вопроса. Любая помощь будет оценена.

    import requests
    from bs4 import BeautifulSoup

    URL = 'https://www.amazon.ca/Magnetic-Erase-Whiteboard-Bulletin- 
    Board/dp/B07GNVZKY2/ref=sr_1_3_sspa?keywords=whiteboard&qid=1578902710&s=office&sr=1-3-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzOE5ZSkFGSDdCOFVDJmVuY3J5cHRlZElkPUEwMDM2ODA4M0dWMEtMWkI1U1hJJmVuY3J5cHRlZEFkSWQ9QTA0MDIwMjQxMEUwMzlMQ0pTQVlBJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ=='

    headers = {"User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}

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

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

    title = soup.find(id="productTitle")

    print(title)

Ответы [ 2 ]

1 голос
/ 13 января 2020

Ваш код абсолютно правильный. Кажется, есть некоторая проблема с парсером, который вы использовали (html .parser)

Я использовал html5lib вместо html .parser, и код теперь работает:

import requests
from bs4 import BeautifulSoup

URL = 'https://www.amazon.ca/Magnetic-Erase-Whiteboard-BulletinBoard/dp/B07GNVZKY2/ref=sr_1_3_sspa?keywords=whiteboard&qid=1578902710&s=office&sr=1-3-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzOE5ZSkFGSDdCOFVDJmVuY3J5cHRlZElkPUEwMDM2ODA4M0dWMEtMWkI1U1hJJmVuY3J5cHRlZEFkSWQ9QTA0MDIwMjQxMEUwMzlMQ0pTQVlBJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ=='

headers = {"User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}

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

soup = BeautifulSoup(page.content, 'html5lib')

title = soup.find(id='productTitle')

print(title)

Дополнительная информация, не имеющая прямого отношения к ответу:

Что касается другого ответа на этот вопрос, меня не спрашивали капчу при посещении страницы.

Однако Amazon изменяет содержимое ответа, если обнаруживает, что бот посещает веб-сайт: удалите заголовки из метода request.get () и попробуйте page.text

Добавлены заголовки по умолчанию по запросам библиотеки приводят к идентификации запроса как к боту.

0 голосов
/ 13 января 2020

При запросе этой страницы за пределами обычной среды браузера запрашивается капча, я предполагаю, что именно поэтому элемент не существует.

Amazon, вероятно, имеет определенные c меры для противодействия "роботам", обращающимся к их страницам. Я предлагаю взглянуть на их API-интерфейсы, чтобы выяснить, есть ли что-нибудь полезное, вместо того, чтобы непосредственно просматривать веб-страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...