如果对象有其他类,美丽的汤也找不到CSS类

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

如果它有<p class="class1 class2"> ,但它不会被find。 我如何find具有某个类的所有对象,而不pipe它们是否还有其他类?

以防万一有人遇到这个问题。 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>] 

另外,您不必再inputfindAll。

不幸的是,BeautifulSoup将它视为一个'class1 class2'的空间,而不是两个class ['class1','class2'] 。 解决方法是使用正则expression式来search类而不是string。

这工作:

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

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

尽pipe它的名字,lxml也用于parsing和刮取HTML。 它比BeautifulSoup快得多,它甚至比BeautifulSoup(他们的声望)更好地处理“破碎的”HTML。 如果您不想学习lxml API,它也具有用于BeautifulSoup的兼容性API。

伊恩Bicking同意,并倾向于BeautifulSoup lxml。

没有理由再使用BeautifulSoup,除非你在Google App Engine上,或者任何不是纯粹Python的东西都是不允许的。

你甚至可以用lxml使用CSSselect器,所以比BeautifulSoup更容易使用。 尝试在交互式Python控制台中使用它。

search具有特定CSS类的标签是非常有用的,但CSS属性“class”的名称是Python中的保留字。 使用类作为关键字参数会给你一个语法错误。 至于美丽的汤4.1.2,您可以使用关键字参数class_来searchCSS类:

喜欢:

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