2010-08-26 65 views
0

使用lxml.html,如何在不使用for循環的情況下訪問單個元素?在lxml.html中訪問輸出的第一個元素

這是HTML:

<tr class="headlineRow"> 
    <td> 
    <span class="headline">This is some awesome text</span> 
    </td> 
</tr> 

例如,這將失敗,並IndexError:

for row in doc.cssselect('tr.headlineRow'): 
    headline = row.cssselect('td span.headline') 
    print headline[0] 

這將傳遞:

for row in doc.cssselect('tr.headlineRow'): 
    headline = row.cssselect('td span.headline') 
    for first_thing in headline: 
     print headline[0].text_content() 

回答

0

我使用CSSSelector嘗試了你的榜樣和headline[0]工作正常。請看下圖:

>>> html ="""<tr class="headlineRow"> 
    <td> 
    <span class="headline">This is some awesome text</span> 
    </td> 
</tr>""" 
>>> from lxml import etree 
>>> from lxml.cssselect import CSSSelector 
>>> doc = etree.fromstring(html) 
>>> sel1 = CSSSelector('tr.headlineRow') 
>>> sel2 = CSSSelector('td span.headline') 
>>> for row in sel1(doc): 
    headline = sel2(row) 
    print headline[0] 

<Element span at 8f31e3c> 
0

元素被訪問的訪問嵌套的列表以同樣的方式:

>>> doc[0][0] 
<Element span at ...> 

或通過CSS選擇器:

doc.cssselect('td span.headline')[0] 
0

你的 「失敗」 的例子完全適用於我?或者你在試用時犯了錯誤,或者你正在使用一個老版本的lxml,它有一個 - 現在已修復的bug(我試過2.2.6和2.1.1 - 最老的我有,並且都工作)

1

我通常對這樣的事情使用xpath方法。 它返回匹配元素的列表。

>>> spans = doc.xpath('//tr[@class="headlineRow"]/td/span[@class="headline"]') 
>>> spans[0].text 
'This is some awesome text' 
相關問題