Beautiful Soup无法找到带有其他类的CSS类
如果一个页面上有 <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这个词了。