1

我正在使用 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 (即tttttk)。

更新 2

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

4

2 回答 2

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它自己、它的孩子、孙子等等。

于 2010-08-31T18:09:23.043 回答
1

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

print elem0.getchildren()[0].text

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

于 2010-08-31T18:32:13.747 回答