【问题标题】:Python ElementTree Check the node / element typePython ElementTree 检查节点/元素类型
【发布时间】:2010-08-31 17:18:39
【问题描述】:

我正在使用 ElementTree,无法确定子节点是否为文本。 childelement.text 似乎不起作用,因为即使在不是文本节点的节点上也会给出误报。

有什么建议吗?

例子

<tr>
  <td><a href="sdas3">something for link</a></td>
  <td>tttttk</td>
  <td><a href="tyty">tyt for link</a></td>
</tr>

解析完这个xml文件后,我用Python做这个:

for elem_main in container_trs: #elem_main is each tr
    elem0 = elem_main.getchildren()[0] #td[0]
    elem1 = elem_main.getchildren()[1] #td[1]

    elem0 = elem_main.getchildren()[0]
    print elem0.text

    elem1 = elem_main.getchildren()[1]
    print elem1.text

以上代码没有输出elem0.text;它是空白的。我确实在输出中看到了 elem1.text(即 ttttk)。

更新 2

我实际上正在构建一本字典。来自每个元素的文本使我可以对 HTML 表进行排序。我将如何获得此代码中的 s ?

【问题讨论】:

  • @贾斯汀。请检查示例。
  • 你把我弄糊涂了:)。请改写最后两段。
  • @Rahul 我同意。大声笑更改了文本和代码...

标签: python elementtree


【解决方案1】:

如何使用getiterator 方法遍历所有后代节点:

import xml.etree.ElementTree as xee

content='''
<tr>
  <td><a href="sdas3">something for link</a></td>
  <td>tttttk</td>
  <td><a href="tyty">tyt for link</a></td>
</tr>
'''

def text_content(node):
    result=[]
    for elem in node.getiterator():
        text=elem.text
        if text and text.strip():
            result.append(text)
    return result

container_trs=xee.fromstring(content)
adict={}
for elem in container_trs:
    adict[elem]=text_content(elem)
print(adict)
# {<Element td at b767e52c>: ['tttttk'], <Element td at b767e58c>: ['tyt for link'], <Element td at b767e36c>: ['something for link']}

循环for elem_main in container_trs: 遍历cantainer_trs 的子级。

相比之下,循环 for elem_main in container_trs.getiterator(): 会遍历 container_trs 本身,以及它的子代和孙代等。

【讨论】:

  • 我实际上是在构建字典。来自元素的文本带有每个&lt;tr&gt;,以便我可以对HTML 表进行排序。我如何在这段代码中获得&lt;tr&gt;s?
  • @AJ:我稍微更改了代码以显示如何获取每个td 节点下方的所有文本。
  • 谢谢。明天我会检查并告诉你。
【解决方案2】:

elem0.text 是 None 因为文本实际上是 子元素的一部分。再深入一层:

print elem0.getchildren()[0].text

顺便说一句,elem0[0].text 是同一构造的快捷方式——不需要 getchildren()。

【讨论】:

  • 我知道这一点。我只想知道如何检查我是否需要更深一层?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2014-11-15
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
相关资源
最近更新 更多