Python lxml 遍历 tr 元素

Python lxml iterating through tr elements

我运行在尝试获取 tr 元素的父节点同时遍历所有元素时遇到了一个问题。

这是我正在使用的基本 table。

 <table border=1>
    <tbody>
    <tr>
    <td>
    <p>Some text</p>
    </td>
    <td>
    <p>Some more text</p>
    </td>
    </tr>
    <tr>
    <td>
    <p> Some more text</p>
    </td>
    <td>
    <p> Some more text</p>
    </td>
    </tr>
    <tr>
    <td>
    <p> Some more text</p>
    </td>
    <td>
    <p> Some more text</p>
    </td>
    </tr>
    </tbody>
    </table>

这是我的 Python 使用 lxml

获取父节点的脚本
import lxml.html

htm = lxml.html.parse('plaintable.htm')
tr = htm.xpath('//tr')
for x in tr:
    tbody = tr.getparent()
    if tbody.index(tr) == 1:
        print ('Success!')
print ('Finished')

我在 运行 脚本时遇到此错误: AttributeError: 'list' 对象没有属性 'getparent'

我是 Python 的新手,所以可能是我搞砸了一些简单的事情。我通读了 lxml 文档,但找不到答案。

任何帮助都会很棒!

tr 实际上是一个 xpath 匹配列表。 x 对应于单个 tr 元素 - 改为对其调用 getparent() 方法:

tr = htm.xpath('//tr')
for x in tr:
    tbody = x.getparent()
    # ...

不过,如果您只有一个 tabletbody 元素,我认为在循环中一遍又一遍地获取同一个父元素没有多大意义。为什么不事先定位:

tbody = htm.xpath("//tbody")[0]
for x in tbody.xpath(".//tr"):
    # ...

I need to find the first tr in every table to build it properly

至于这个 - 我会遍历所有 table 元素并找到第一个 tr 元素:

tables = htm.xpath("//table")
for table in tables:
    first_tr = table.xpath(".//tr")[0]