lxml中类似BeautifulSoup的"OR"语法?

6 投票
1 回答
2377 浏览
提问于 2025-04-15 14:06

我正在把一些用BeautifulSoup写的HTML解析代码转换成lxml。我想找出lxml中与以下BeautifulSoup语句相对应的写法:

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

简单来说,我想在文档中找到所有的“a”标签,这些标签的class属性要么是“current zzt”,要么是“zzt”。BeautifulSoup允许我们传入一个列表、字典,甚至是正则表达式来进行匹配。

那在lxml中怎么写呢?

谢谢!

1 个回答

3

不,lxml库并没有你想要的那种“找到第一个元素或者返回None”的方法。如果你需要这样的功能,可以用 (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,正如你所期待的。不过问题是,它似乎不支持CSS选择器所需要的复杂XPath语法。

撰写回答