Beautiful Soup не может найти класс CSS, если объект имеет другие классы, тоже
если страница имеет <div class="class1">
и <p class="class1">
, тогда soup.findAll(True, 'class1')
найдет их оба.
Если он имеет <p class="class1 class2">
, он не будет найден. Как найти все объекты с определенным классом, независимо от того, есть ли у них другие классы?
Ответы
Ответ 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")