Beautiful Soup无法找到带有其他类的CSS类

40 投票
4 回答
16694 浏览
提问于 2025-04-15 13:26

如果一个页面上有 <div class="class1"><p class="class1">,那么使用 soup.findAll(True, 'class1') 就能找到这两个元素。

但是,如果页面上有 <p class="class1 class2">,那么它就找不到了。那我该怎么做才能找到所有带有某个特定类的元素,不管它们是否还有其他类呢?

4 个回答

11

你应该使用 lxml。它可以处理多个用空格分开的类值(比如 'class1 class2')。

虽然名字里有“lxml”,但它也可以用来解析和抓取HTML。它比BeautifulSoup快得多,而且在处理“坏掉”的HTML时表现得比BeautifulSoup更好(这是它的一个亮点)。如果你不想学习lxml的用法,它还有一个和BeautifulSoup兼容的接口。

Ian Bicking也同意,他更喜欢lxml而不是BeautifulSoup。

现在没有理由再使用BeautifulSoup了,除非你在Google App Engine之类的地方,那里的环境不允许使用非纯Python的东西。

你甚至可以在lxml中使用CSS选择器,这样使用起来比BeautifulSoup容易多了。可以试着在交互式的Python控制台里玩一下。

34

不幸的是,BeautifulSoup把这个看作是一个带空格的类 'class1 class2',而不是两个独立的类 ['class1','class2']。解决这个问题的方法是用正则表达式来查找类,而不是直接用字符串。

这样做是有效的:

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

如果有人遇到这个问题,想告诉大家,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这个词了。

撰写回答