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

0 投票
4 回答
1752 浏览
提问于 2025-04-16 03:19

使用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

访问元素的方法和访问嵌套列表的方法是一样的:

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

或者你也可以通过CSS选择器来访问:

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

我通常会用xpath方法来处理这种情况。它会返回一个匹配元素的列表。

>>> spans = doc.xpath('//tr[@class="headlineRow"]/td/span[@class="headline"]')
>>> spans[0].text
'This is some awesome text'
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>

撰写回答