lxml中类似BeautifulSoup的"OR"语法?
我正在把一些用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语法。