如果对象也有其他类,Beautiful Soup 也找不到 CSS 类

Posted

技术标签:

【中文标题】如果对象也有其他类,Beautiful Soup 也找不到 CSS 类【英文标题】:Beautiful Soup cannot find a CSS class if the object has other classes, too 【发布时间】:2010-11-17 14:00:58 【问题描述】:

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

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

【问题讨论】:

更新:据报道,这已在 4 beta 5 中得到修复:bugs.launchpad.net/beautifulsoup/+bug/410304 【参考方案1】:

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

这行得通:

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

【讨论】:

这似乎已经修复了。 @Kugel:然后再添加一个答案?【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

Ian Bicking agrees 并且更喜欢 lxml 而不是 BeautifulSoup。

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

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

【讨论】:

来自 lxml 自己的文档:“虽然 libxml2(以及 lxml)也可以解析损坏的 HTML,但 BeautifulSoup 更宽容一些,并且对编码检测有更好的支持。” 很高兴你喜欢它。希望你也能传播这个词,lxml 是一个被低估的库。我认为很多人会忽略它,因为它的名称中有“XML”,而且它的文档不如 BeautifulSoup 的好。 BS 的名称和图形对它很有魅力,这使得它由于表面原因而更具吸引力。 是的,它没有作为刮刀销售,我在文档中没有看到足够多的此类示例。 顶部的第一个链接是404ing,所以我把它改成了lxml主页。希望这是预期的结果。 美汤v4现在支持different parsers的使用,包括lxml。【参考方案4】:

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

点赞:

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

【讨论】:

对不起,但我相信你的回答是错误的。根据 Beautiful Soup 文档 (crummy.com/software/BeautifulSoup/bs3/…),有两个选项可以使用 find_all 来查找带有 CSS 类的标签:将类名作为字符串传递或创建一个带有键“class”和值的字典CSS 类的名称。 很高兴你看到我的回答,但我使用的是 bs4,而不是 bs3,也许界面已经改变@RodrigoTaboada 根据美丽的汤4 doc link 好的,很抱歉。我搜索 find_all 时的第一项是 bs3 文档,我没有意识到这一点。

以上是关于如果对象也有其他类,Beautiful Soup 也找不到 CSS 类的主要内容,如果未能解决你的问题,请参考以下文章

python下很帅气的爬虫包 - Beautiful Soup 示例

使用 Beautiful Soup 查找特定类

Beautiful Soup的使用

Beautiful Soup:四大常用对象

使用 Beautiful Soup 从非类部分获取数据

Python爬虫系列:Beautiful Soup解析HTML之把HTML转成Python对象