Почему beautiful soup select by class возвращает пустой список с помощью find_all works?

#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] — Есть и другие отличия, такие как поддержка регулярных выражений, которые объясняются в документах