Python ElementTree 检查节点/元素类型

1 投票
2 回答
3373 浏览
提问于 2025-04-16 03:32

我在使用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表格进行排序。我该如何在这段代码中获取这些文本呢?

2 个回答

1

elem0.text 是 None,因为文本实际上是属于 <a> 这个子元素的。只需往下看一层就可以了:

print elem0.getchildren()[0].text

顺便说一下,elem0[0].text 是一个简便的方法,可以直接获取同样的内容——不需要使用 getchildren()。

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: 是在遍历 container_trs 的直接子节点。

而循环 for elem_main in container_trs.getiterator(): 则是遍历 container_trs 本身,以及它的所有子节点、孙子节点等等。

撰写回答