#python #html #beautifulsoup
#python #HTML #beautifulsoup
Вопрос:
Я пытаюсь проанализировать 100 лучших хитов за определенный день с рекламных щитов с красивым супом. Я попытался выбрать раздел по имени класса, но это не сработало. Я попытался использовать find_all по классу, и это работает. Почему find_all работает только в этом случае?
from bs4 import BeautifulSoup
import requests
billboard_website = "https://www.billboard.com/charts/hot-100/2019-05-09"
response = requests.get(f"{billboard_website}")
soup = BeautifulSoup(response.text, "html.parser")
print(soup.select(".chart-element__information__song text--truncate color--primary")) # returns an empty list
print(soup.find_all(class_="chart-element__information__song text--truncate color--primary")) # returns the full list
Комментарии:
1. В контексте селектора CSS я считаю, что пробелы указывают на вложенные элементы, и у вас есть пробел между
truncate
иcolor
.2. Спасибо, но я попробовал другой класс,
print( soup.select(‘.chart-list__wrapper’) )
все равно возвращает пустой список.3. Как
requests.get()
указано , эта страница не содержит никаких вхожденийchart-list__wrapper
. (запросы не выполняют javascript.)4.
[i.text for i in soup.select('.chart-element__information__song')]
многозначный класс вам нужно объединить отдельные классы с.
помощью селекторов классов в css. Или просто выберите один из классов, если это необходимо. В этом случае вы можете просто использовать первый класс.
Ответ №1:
Оба работают в зависимости от того, чего вы пытаетесь достичь, как объяснено в документах
По сути find_all(class_="Class1 Class2")
, это почти эквивалентно select(.Class1.Class2)
, единственное отличие заключается в том, что для первого требуется точная строка, в то время как для последнего требуются селекторы CSS, но не заботится о порядке [1], например
Допустим, у вас есть следующий элемент <p class="A B">
find_all(class_=»B A») не будет совпадать, но select(.B.A)
будет
Если вы исправите свой синтаксис soup.select(".chart-element__information__song.text--truncate.color--primary")
, он должен возвращать те же значения
[1] — Есть и другие отличия, такие как поддержка регулярных выражений, которые объясняются в документах