【问题标题】:Is there a way to skip nodes/elements with iterparse lxml?有没有办法使用 iterparse lxml 跳过节点/元素?
【发布时间】:2020-11-03 18:12:33
【问题描述】:

有没有办法使用 lxml iterparse 跳过一个元素而不检查标签?以这个xml为例:

<root>
    <sample>
        <tag1>text1</tag1>
        <tag2>text2</tag2>
        <tag3>text3</tag3>
        <tag4>text4</tag4>
    </sample>
    <sample>
        <tag1>text1</tag1>
        <tag2>text2</tag2>
        <tag3>text3</tag3>
        <tag4>text4</tag4>
    </sample>
</root>
    

如果我关心tag1 和tag4,检查tag2 和tag3 会消耗一些时间。如果文件不大,那并不重要,但如果我有一百万个&lt;sample&gt; 节点,如果我不必检查tag2 和tag3,我可以减少一些搜索时间。它们一直都在,我从不需要它们。

在 lxml 中使用 iterparse

import lxml

xmlfile = 'myfile.xml'
context = etree.iterparse(xmlfile, events('end',), tag='sample')

for event, elem in context:
    for child in elem:
        if child.tag == 'tag1'
            my_list.append(child.text)

            #HERE I'd like to advance the loop twice without checking tag2 and tag3 at all
            #something like:

            #next(child)
            #next(child)

        elif child.tag == 'tag4'
             my_list.append(child.text)
    

【问题讨论】:

    标签: python lxml iterparse


    【解决方案1】:

    如果您像在 iterparse 中一样在 iterchildren 中使用 tag arg,则可以“跳过”tag1 和 tag4 以外的元素。

    示例...

    from lxml import etree
    
    xmlfile = "myfile.xml"
    
    my_list = []
    
    for event, elem in etree.iterparse(xmlfile, tag="sample"):
        for child in elem.iterchildren(tag=["tag1", "tag4"]):
            if child.tag == "tag1":
                my_list.append(child.text)
            elif child.tag == "tag4":
                my_list.append(child.text)
    
    print(my_list)
    

    打印输出...

    ['text1', 'text4', 'text1', 'text4']
    

    【讨论】:

    • 不错。谢谢!我给你打勾是因为你回答了我的问题,但这对我的速度没有任何帮助。在我的系统上为 1.5 gb 文件解析增加了不到 10 秒的时间。
    • @Dan - 如果您想等待看看是否有人有更好的选择,请随意删除复选标记。如果没有可接受的答案,会有更多人访问该问题。
    • 好的。我会给它几天或几周,如果没有任何结果,我会把它放回去,因为你确实回答了。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    相关资源
    最近更新 更多