首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lxml.etree iterparse()和完全解析元素

lxml.etree iterparse()和完全解析元素
EN

Stack Overflow用户
提问于 2015-04-17 10:34:41
回答 2查看 2.7K关注 0票数 2

我有一个包含节点的XML文件,如下所示:

代码语言:javascript
复制
<trkpt lat="-37.7944415" lon="144.9616159">
  <ele>41.3681107</ele>
  <time>2015-04-11T03:52:33.000Z</time>
  <speed>3.9598</speed>
</trkpt>

我使用lxml.etree.iterparse()迭代地解析这棵树。我循环遍历每个trkpt元素的子节点,并希望打印子节点的文本值。例如。

代码语言:javascript
复制
for event, element in etree.iterparse(infile, events=("start", "end")):
    if element.tag == NAMESPACE + 'trkpt':
        for child in list(element):
            print child.text

问题是,在这个阶段,节点没有文本,所以打印的输出是'None‘。

我已经通过将'print child.text‘语句替换为'print etree.tostring(etree.tostring)’来验证这一点,输出如下所示

代码语言:javascript
复制
<ele/>
<time/>
<speed/>    

根据文档,“请注意,在接收start事件时,元素的文本、尾部和子元素还不一定存在。只有end事件保证该元素已被完全解析。”

所以我把for循环改为这样,注意'if event == "end":‘语句

代码语言:javascript
复制
for event, element in etree.iterparse(infile, events=("start", "end")):
    if element.tag == NAMESPACE + 'trkpt':
        if event == "end":
            for child in list(element):
                print child.text

但我还是得到了同样的结果。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2015-11-23 00:11:42

你确定你不会像这样在你的条件语句后调用element.clear()吗?

代码语言:javascript
复制
for event, element in etree.iterparse(infile, events=("start", "end")):
  if element.tag == NAMESPACE + 'trkpt' and event == 'end':
    for child in list(element):
        print child.text
  element.clear()

问题是解析器在发送trkptend事件之前会发出子元素的事件(因为它首先遇到嵌套元素的结束标记)。如果在为外部元素调用end事件之前对已解析的元素进行任何修改,则可能会发生您所描述的行为。

考虑以下替代方案:

代码语言:javascript
复制
for event, element in etree.iterparse(infile, events=('end',),
    tag=NAMESPACE + 'trkpt'):
  for child in element:
     print child.text
  element.clear()
票数 1
EN

Stack Overflow用户

发布于 2015-05-14 01:04:01

您是否尝试显式地使用iterparse,或者您可以使用其他方法。

代码语言:javascript
复制
e.g.

from lxml import etree

tree = etree.parse('/path/to/file')
root = tree.getroot()
for elements in root.findall('trkpt'):
    for child in elements:
        print child.text

lxml非常擅长解析,并且不会占用太多的memory...not,因此可以确定这是否解决了您的问题,或者您是否正在尝试使用上面的特定方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29689256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档