40

如果一个页面有<div class="class1">and <p class="class1">,那么soup.findAll(True, 'class1')会同时找到它们。

但是,如果它有<p class="class1 class2">,它将不会被找到。如何找到具有某个类的所有对象,而不管它们是否也有其他类?

4

4 回答 4

34

不幸的是,BeautifulSoup 将其视为一个包含空格的类,'class1 class2'而不是两个类['class1','class2']。一种解决方法是使用正则表达式而不是字符串来搜索类。

这有效:

soup.findAll(True, {'class': re.compile(r'\bclass1\b')})
于 2009-08-07T03:49:51.823 回答
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。

于 2013-08-25T01:28:49.407 回答
11

你应该使用lxml。它适用于由空格分隔的多个类值('class1 class2')。

尽管它的名字,lxml 也用于解析和抓取 HTML。它比 BeautifulSoup 快得多,而且它甚至比 BeautifulSoup 更好地处理“损坏的”HTML(他们声名狼藉)。如果您不想学习 lxml API,它也有适用于 BeautifulSoup 的兼容性 API。

Ian Bicking 同意并更喜欢 lxml 而不是 BeautifulSoup。

没有理由再使用 BeautifulSoup,除非您使用的是 Google App Engine 或其他任何不纯 Python 的东西。

您甚至可以将 CSS 选择器与 lxml 一起使用,因此它比 BeautifulSoup 更容​​易使用。尝试在交互式 Python 控制台中使用它。

于 2009-08-07T15:18:07.263 回答
2

搜索具有特定 CSS 类的标签非常有用,但 CSS 属性的名称“class”是 Python 中的保留字。使用 class 作为关键字参数会给你一个语法错误。从 Beautiful Soup 4.1.2 开始,您可以使用关键字参数 class_ 按 CSS 类进行搜索:

像:

soup.find_all("a", class_="class1")
于 2015-02-03T04:06:15.907 回答