lxml相当于BeautifulSoup“OR”语法?

时间:2009-09-05 23:04:19

标签: python beautifulsoup lxml

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

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

基本上我想在文档中找到所有“a”标签,它们的类属性为“current zzt”或“zzt”。 BeautifulSoup允许人们传入列表,字典甚至常规快递来执行匹配。

什么是lxml等价物?

谢谢!

1 个答案:

答案 0 :(得分: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')确实会找到你想要的第一个元素或无。麻烦的是,它似乎不支持CSSSelector所需的丰富XPath语法。