Подтвердить что ты не робот

Beautiful Soup не может найти класс CSS, если объект имеет другие классы, тоже

если страница имеет <div class="class1"> и <p class="class1">, тогда soup.findAll(True, 'class1') найдет их оба.

Если он имеет <p class="class1 class2">, он не будет найден. Как найти все объекты с определенным классом, независимо от того, есть ли у них другие классы?

4b9b3361

Ответ 1

На всякий случай кто-то сталкивается с этим вопросом. Теперь BeautifulSoup поддерживает это:

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
Type "copyright", "credits" or "license" for more information.

In [1]: import bs4

In [2]: soup = bs4.BeautifulSoup('<div class="foo bar"></div>')

In [3]: soup(attrs={'class': 'bar'})
Out[3]: [<div class="foo bar"></div>]

Кроме того, вам больше не нужно набирать findAll.

Ответ 2

К сожалению, BeautifulSoup рассматривает это как класс с пространством в нем 'class1 class2', а не двумя классами ['class1','class2']. Обходным путем является использование регулярного выражения для поиска класса вместо строки.

Это работает:

soup.findAll(True, {'class': re.compile(r'\bclass1\b')})

Ответ 3

Вы должны использовать lxml. Он работает с несколькими значениями класса, разделенными пробелами ( "class1 class2" ).

Несмотря на свое имя, lxml также предназначен для разбора и очистки HTML. Это намного, намного быстрее, чем BeautifulSoup, и даже обрабатывает "сломанный" HTML лучше, чем BeautifulSoup (их претензии на славу). Он также имеет API совместимости для BeautifulSoup, если вы не хотите изучать API-интерфейс lxml.

Ian Bicking соглашается и предпочитает lxml над BeautifulSoup.

Нет смысла использовать BeautifulSoup больше, если вы не используете Google App Engine или что-то там, где не разрешено ничего, кроме Python.

Вы даже можете использовать селектор CSS с lxml, поэтому его гораздо проще использовать, чем BeautifulSoup. Попробуйте сыграть с ним в интерактивной консоли Python.

Ответ 4

Очень полезно искать тег, который имеет определенный CSS-класс, но имя атрибута CSS, "class", является зарезервированным словом в Python. Использование класса в качестве аргумента ключевого слова даст вам синтаксическую ошибку. Начиная с Beautiful Soup 4.1.2, вы можете выполнять поиск по классу CSS с использованием ключевого слова argument class _:

Как

soup.find_all("a", class_="class1")