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

2024-03-29 02:12:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 对象divtrue页面classsoupclass1findall
3条回答

以防有人碰到这个问题。美组现在支持:

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了。

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

这是有效的:

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

你应该用lxml。它可以处理由空格分隔的多个类值(“class1 class2”)。

尽管它的名字是lxml,但它也用于解析和抓取HTML。它比BeautifulSoup快得多,甚至比BeautifulSoup(他们的名声)更好地处理“坏”的HTML。如果您不想学习lxml API,它还有一个用于美化组的兼容性API。

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

没有理由再使用BeautifulSoup了,除非你是在Google App Engine上,或者是在不允许使用纯Python的地方。

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

相关问题 更多 >