Почему BeautifulSoup возвращает пустой список на сайтах результатов поиска? - PullRequest
0 голосов
/ 19 февраля 2019

Я рассчитываю узнать цену конкретной статьи в Интернете, и я не могу получить элемент под тегом, но я мог бы сделать это на другом (другом) сайте сайта.На этом конкретном сайте я получаю только пустой список.Печатание soup.text также работает.Я не хочу использовать Selenium, если это возможно, потому что я пытаюсь понять, как BS4 работает в таких случаях.

import requests
from bs4 import BeautifulSoup
url = 'https://reverb.com/p/electro-harmonix-oceans-11-reverb-2018'

r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
cards = soup.select(".product-row-card")
print (cards)
>>>[]

Что я хотел бы получить, так это название и стоимость картна сайте.У меня также была эта проблема раньше, но каждое решение здесь предлагает только использование Selenium (что я мог бы сделать работу), но я не знаю почему.Я нахожу это еще менее практичным.

Кроме того, есть ли шанс, когда я прочитал, что веб-сайт использует javascript для получения этих результатов.Если это так, почему я могу получить данные в https://reverb.com/price-guide/effects-and-pedals, но не здесь?Будет ли Selenium единственным решением в этом случае?

1 Ответ

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

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

Вы также правы в том, что Selenium WebDriver часто используется в этих ситуациях, поскольку он управляет реальным, полноценным экземпляром браузера.Но это не единственный вариант, так как requests-html имеет поддержку javascript и, возможно, менее громоздок для простого просмотра.

В качестве примера, чтобы начать, ниже приведены заголовок и ценаиз первых пяти элементов на сайте, к которому вы обращаетесь:

from requests_html import HTMLSession
from bs4 import BeautifulSoup

session = HTMLSession()
r = session.get("https://reverb.com/p/electro-harmonix-oceans-11-reverb-2018")
r.html.render(sleep=5)

soup = BeautifulSoup(r.html.raw_html, "html.parser")
for item in soup.select(".product-row-card", limit=5):
    title = item.select_one(".product-row-card__title__text").text.strip()
    price = item.select_one(".product-row-card__price__base").text.strip()
    print(f"{title}: {price}")

Результат:

Electro-Harmonix EHX Oceans 11 Eleven Reverb Hall Spring Guitar Effects Pedal: $119.98
Electro-Harmonix Oceans 11 Reverb - Used: $119.99
Electro-Harmonix Oceans 11 Multifunction Digital Reverb Effects Pedal: $122
Pre-Owned Electro-Harmonix Oceans 11 Reverb Multi Effects Pedal Used: $142.27
Electro-Harmonix Oceans 11 Reverb Matte Black: $110
...