2009-09-05 27 views
6

我正在將一些html解析代碼從BeautifulSoup轉換爲lxml。我試圖找出LXML相當於語法如下BeautifullSoup聲明:等價於BeautifulSoup「OR」語法的lxml?

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

基本上,我想找到的所有文件中有兩種「當前ZZT」的類屬性的「一」的標籤或「zzt」。 BeautifulSoup允許一個傳遞一個列表,字典,甚至是一個正則表達式來執行匹配。

什麼是lxml等價物?

謝謝!

+0

我認爲xpath expr應該是:'// a [@ class ='current zzt'or @ class ='zzt'' – tonfa 2009-09-05 23:41:21

+0

(它在末尾缺少a) – tonfa 2009-09-05 23:43:28

+0

這可以工作 - 但它返回一個列表(如findall()會)。任何方式使其行爲更像find()? (沒有在最後加上[0]?) – erikcw 2009-09-06 15:47:45

回答

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語法。