6

我正在将一些 html 解析代码从 BeautifulSoup 转换为 lxml。我正在尝试找出以下 BeautifullSoup 语句的 lxml 等效语法:

soup.find('a', {'class': ['current zzt', 'zzt']})

基本上我想在文档中找到所有具有“current zzt”或“zzt”类属性的“a”标签。BeautifulSoup 允许传入一个列表、字典,甚至是正则表达式来执行匹配。

lxml 等价物是什么?

谢谢!

4

1 回答 1

3

不,lxml 不提供您正在寻找的“先查找或返回无”方法。只需(select(soup) or [None])[0]在需要时使用,或编写一个函数来为您完成。

#!/usr/bin/python
import lxml.html
import lxml.cssselect
soup = lxml.html.fromstring("""
        <html>
        <a href="foo" class="yyy zzz" />
        <a href="bar" class="yyy" />
        <a href="baz" class="zzz" />
        <a href="quux" class="zzz yyy" />
        <a href="warble" class="qqq" />
        <p class="yyy zzz">Hello</p>
        </html>""")

select = lxml.cssselect.CSSSelector("a.yyy.zzz, a.yyy")
print [lxml.html.tostring(s).strip() for s in select(soup)]
print (select(soup) or [None])[0]

好的,所以soup.find('a')确实会按照您的期望首先找到一个元素或 None 。问题是,它似乎不支持 CSSSelector 所需的丰富 XPath 语法。

于 2009-09-15T19:57:42.803 回答