Модуль BeautifulSoup не обнаруживает никаких тегов - PullRequest
0 голосов
/ 15 февраля 2019

Я новичок в python и пытаюсь создать проект, в котором я открываю все ссылки на обзоры на странице продуктов Amazon.Почему метод soup.select() не работает для поиска подходящих html-тегов для ссылок python?

import webbrowser, requests, sys, bs4, logging

logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - % (levelname)s - %(message)s')
print("Searching...") # Text to display while searching amazon

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) 
        AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 
        Safari/537.36'}
url = input("Enter the url: ")
res = requests.get(url, headers=headers)
res.raise_for_status()

# Retrieve reviews found
soup = bs4.BeautifulSoup(res.text, features='html.parser')

# Open a tab for each review found
linkElems = soup.select('div.a-row a.a-size-base.a-link-normal.review- 
    title.a-color-base.a-text-bold')
numOpen = min(5, len(linkElems))
logging.debug(linkElems)
for i in range(numOpen):
    logging.debug("Link is: " + str(linkElems[i].get('href')))
    webbrowser.open('https://amazon.com' + linkElems[i].get('href'))

Я ожидал, что этот код создаст и откроет список ссылок на обзор продуктов.Однако, когда я запускаю его, список найденных тегов оказывается пустым.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

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

linkElems = soup.select("a.review-title")

Или даже быстрее * Селекторы класса

linkElems = soup.select(".review-title")

являются вторым самым быстрым методом выбора после идентификатора.

0 голосов
/ 15 февраля 2019

обновление 1: по мере редактирования своего поста и исправления пробелов в его кодовом формате, я обновляю свой ответ.

когда программа запрашивает ссылку, пишите (иливставьте) свою ссылку и добавьте один пробел перед нажатием ввода .

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

делая это, ваш код на самом деле работает нормально, как я продемонстрировал в моем первом ответе.

мой предыдущий ответ: я заметил, что у вас неправильный пробел здесь 'a-color-base'

замените эту строку:

linkElems = soup.select('div.a-row a.a-size-base.a-link-normal.review-title.a- color-base.a-text-bold')

на

linkElems = soup.select('div.a-row a.a-size-base.a-link-normal.review-title.a-color-base.a-text-bold')

дополнительно: в настоящее время ваш код работает только с amazon.com, чтобы ваш код работал с другими сайтами amazons, такими как amazon.in amazon.co.uk, вам нужно изменить эту строку:

webbrowser.open('https://amazon.com' + linkElems[i].get('href'))

что-то вроде:

from urllib.parse import urlparse
url_components = urlparse(url)
webbrowser.open('https://' + url_components.netloc + linkElems[i].get('href'))

теперь он будет корректно работать с другими сайтами Amazon, такими как amazon.in, не только amazon.com, попробуйте.

testdrive:

Enter the url: https://www.amazon.in/Intex-PB-16K-Poly-16000mAH-Lithium/dp/B07843GH8X/ref=cm_cr_srp_d_product_top?ie=UTF8 
 2019-02-15 22:51:28,940 - DEBUG - Starting new HTTPS connection (1): www.amazon.in:443
 2019-02-15 22:51:30,125 - DEBUG - https://www.amazon.in:443 "GET /Intex-PB-16K-Poly-16000mAH-Lithium/dp/B07843GH8X/ref=cm_cr_srp_d_product_top?ie=UTF8%20 HTTP/1.1" 200 None
 2019-02-15 22:51:32,019 - DEBUG - [<a class="a-size-base a-link-normal review-title a-color-base a-text-bold" data-hook="review-title" href="/gp/customer-reviews/R123ICSCDM2MF3/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&amp;ASIN=B07843GH8X">Nice product.</a>, <a class="a-size-base a-link-normal review-title a-color-base a-text-bold" data-hook="review-title" href="/gp/customer-reviews/R3OTWE19SMPPVQ/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&amp;ASIN=B07843GH8X">Not a good product. It takes a day to charge the ...</a>, <a class="a-size-base a-link-normal review-title a-color-base a-text-bold" data-hook="review-title" href="/gp/customer-reviews/R1Z51ERFCD7D6P/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&amp;ASIN=B07843GH8X">not portable easily..</a>, <a class="a-size-base a-link-normal review-title a-color-base a-text-bold" data-hook="review-title" href="/gp/customer-reviews/R24GYC4HRBGTM1/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&amp;ASIN=B07843GH8X">Five Stars</a>, <a class="a-size-base a-link-normal review-title a-color-base a-text-bold" data-hook="review-title" href="/gp/customer-reviews/R2P5ILE8KQF8PJ/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&amp;ASIN=B07843GH8X">Fine not superb</a>, <a class="a-size-base a-link-normal review-title a-color-base a-text-bold" data-hook="review-title" href="/gp/customer-reviews/R3C9ZYFRT9NWAK/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&amp;ASIN=B07843GH8X">Quality &amp; Performance</a>, <a class="a-size-base a-link-normal review-title a-color-base a-text-bold" data-hook="review-title" href="/gp/customer-reviews/R16F4OE3LWHHQI/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&amp;ASIN=B07843GH8X">Worst experience. Don’t buy</a>, <a class="a-size-base a-link-normal review-title a-color-base a-text-bold" data-hook="review-title" href="/gp/customer-reviews/R26ROATK8PU6TL/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&amp;ASIN=B07843GH8X">Very bad product</a>]
 2019-02-15 22:51:32,019 - DEBUG - Link is: /gp/customer-reviews/R123ICSCDM2MF3/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&ASIN=B07843GH8X
 2019-02-15 22:51:32,295 - DEBUG - Link is: /gp/customer-reviews/R3OTWE19SMPPVQ/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&ASIN=B07843GH8X
 2019-02-15 22:51:32,628 - DEBUG - Link is: /gp/customer-reviews/R1Z51ERFCD7D6P/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&ASIN=B07843GH8X
 2019-02-15 22:51:32,933 - DEBUG - Link is: /gp/customer-reviews/R24GYC4HRBGTM1/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&ASIN=B07843GH8X
 2019-02-15 22:51:33,302 - DEBUG - Link is: /gp/customer-reviews/R2P5ILE8KQF8PJ/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&ASIN=B07843GH8X

в случае, если ваша функция отладки выдает ошибку: Я не уверен, является ли это место в вашем реальном коде или оно отображается здесь в плохом формате записи, но в любом случае вы должны удалить пробел из формата arg '% (levelname) s для отладки, чтобы работать должным образом:

замените это:

logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %  (levelname)s - %(message)s')

на

logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

надеюсь, это поможет вам.

...