2009-09-05 5 views
6

私はBeautifulSoupからlxmlにいくつかのhtml解析コードを変換しています。私は、次のBeautifullSoup文のlxmlの同等の構文を理解しようとしている:lxmlはBeautifulSoup "OR"の構文に相当しますか?

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

私は「現在のZZT」のいずれかのクラス属性を持つ文書で「」タグの全てを見つけたいですまたは "zzt"。 BeautifulSoupは、リスト、辞書、または正規表現でさえも渡して、マッチを実行することができます。

lxmlに相当するものは何ですか?

ありがとうございます!

+0

私はxpathのexprは次のようにするべきだと思います: – tonfa

+0

(最後にaがありません) – tonfa

+0

それは動作しますが、リストを返します。 (findall()のように)。 find()のように動作するようにするには? (最後に[0]をつけるのではなく) – erikcw

答えて

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')は確かに最初の要素はNoneを見つけるだろう。問題は、CSSSelectorに必要な豊富なXPath構文をサポートしていないようです。

関連する問題