【问题标题】:Python lxml iterating through tr elementsPython lxml遍历tr元素
【发布时间】:2016-11-12 04:08:37
【问题描述】:

我在尝试获取 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: 'list' 对象没有属性 'getparent'

我对 Python 很陌生,所以我可能会搞砸一些简单的事情。我通读了 lxml 文档,但找不到答案。

任何帮助都会很棒!

【问题讨论】:

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


    【解决方案1】:

    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]
    

    【讨论】:

    • 啊完美!我误解了如何在 for 循环中调用索引。我习惯了 JavaScript,所以过得很艰难。简而言之,我正在基于 HTML 文档中的表构建一个 XML 文件。我目前正在使用 36 个不同的表。我需要在每个表中找到第一个 tr 才能正确构建它
    • @Chad 得到了它,还更新了“我需要在每个表中找到第一个 tr 以正确构建它”部分的示例代码。谢谢!
    • 太棒了,这对创建父节点非常有帮助。非常感谢您的帮助!
    猜你喜欢
    • 2018-07-29
    • 2014-07-27
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多