Python lxml迭代tr元素

时间:2016-07-09 20:36:24

标签: python python-3.x lxml lxml.html

我试图获取tr元素的父节点,同时迭代它们时遇到了问题。

这是我正在使用的基本表格。

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

这是我使用lxml

获取父节点的Python脚本
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:&#39; list&#39;对象没有属性&#39; getparent&#39;

我对Python很陌生,所以它可能很简单,我搞砸了。我仔细阅读了lxml文档,但我找不到答案。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:2)

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"):
    # ...
  

我需要找到每个表中的第一个tr来正确构建它

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

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