【问题标题】:lxml equivalent to BeautifulSoup "OR" syntax?lxml相当于BeautifulSoup“OR”语法?
【发布时间】:2010-11-25 22:46:45
【问题描述】:

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

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

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

lxml 等价物是什么?

谢谢!

【问题讨论】:

  • 我认为 xpath expr 应该是://a[@class='current zzt' or @class='zzt'
  • (最后少了一个 ])
  • 这行得通-但它返回一个列表(就像 findall() 一样)。有什么方法可以让它表现得更像 find()? (不只是在末尾添加 [0] 吗?)
  • class= 'current zzt' 不是一个单一的类。是两个班。您的意思是要查找包含“zzt”类或同时包含“当前”和“zzt”类的所有链接?
  • @endolith:我想找到 class="current zzt" OR class="zzt" 的所有链接。所以它要么有机器人,要么只有“zzt”。

标签: python beautifulsoup lxml


【解决方案1】:

不,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 语法。

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 2011-01-02
    • 1970-01-01
    • 2014-02-14
    • 2011-11-25
    • 2018-09-12
    • 2012-07-03
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多