在lxml.html中访问输出的第一个元素

时间:2010-08-26 06:53:57

标签: python lxml

使用lxml.html,如何在不使用for循环的情况下访问单个元素?

这是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()

4 个答案:

答案 0 :(得分:1)

我通常使用xpath方法来做这样的事情。 它返回匹配元素的列表。

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

答案 1 :(得分: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>

答案 2 :(得分:0)

访问元素的方式与访问嵌套列表的方式相同:

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

或通过CSS选择器:

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

答案 3 :(得分:0)

您的“失败”示例对我来说非常合适吗?要么在尝试时犯了错误,要么你正在使用旧版本的lxml,它有一个 - 现在已修复 - 错误(我试过2.2.6,而2.1.1 - 我用过的最老的,都有效)