Beautiful Soup не может найти класс CSS, если у объекта есть и другие классы - PullRequest
40 голосов
/ 07 августа 2009

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

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

Ответы [ 4 ]

35 голосов
/ 07 августа 2009

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

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

soup.findAll(True, {'class': re.compile(r'\bclass1\b')})
18 голосов
/ 25 августа 2013

На всякий случай, если кто-нибудь сталкивается с этим вопросом. 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.

11 голосов
/ 07 августа 2009

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

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

Ян Бикинг соглашается и предпочитает lxml, а не BeautifulSoup.

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

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

2 голосов
/ 03 февраля 2015

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

Как:

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