python元素树迭代解析过滤器节点和子节点

标签 python iterparse celementtree

我正在尝试使用elementTree的iterparse函数根据文本过滤节点并将它们写入新文件。我使用 iterparse 因为输入文件很大(100+ MB)

input.xml

<xmllist>
        <page id="1">
        <title>movie title 1</title>
        <text>this is a moviein theatres/text>
        </page>
        <page id="2">
        <title>movie title 2</title>
        <text>this is a horror film</text>
        </page>
        <page id="3">
        <title></title>
        <text>actor in film</text>
        </page>
        <page id="4">
        <title>some other topic</title>
        <text>nothing related</text>
        </page>
</xmllist>

预期输出(文本中包含“movie”或“film”的所有页面)

<xmllist>
        <page id="1">
        <title>movie title 1</title>
        <text>this is a movie<n theatres/text>
        </page>
        <page id="2">
        <title>movie title 2</title>
        <text>this is a horror film</text>
        </page>
        <page id="3">
        <title></title>
        <text>actor in film</text>
        </page>
</xmllist>

当前代码

import xml.etree.cElementTree as etree
from xml.etree.cElementTree import dump

output_file=open('/tmp/outfile.xml','w')

for event, elem in iter(etree.iterparse("/tmp/test.xml", events=('start','end'))):
    if event == "end" and elem.tag == "page": #need to add condition to search for strings
        output_file.write(elem)
        elem.clear()

如何添加正则表达式以根据页面的文本属性进行过滤?

最佳答案

您正在寻找子项,而不是属性,因此最简单的方法是在迭代中“经过”标题时对其进行分析,并记住结果,直到获得结果页面的末尾:

import re

good_page = False
for event, elem in iter(etree.iterparse("/tmp/test.xml", events=('start','end'))):
    if event == 'end':
        if elem.tag = 'title':
            good_page = re.search(r'film|movie', elem.text)
        elif elem.tag == 'page':
            if good_page:
                output_file.write(elem)
            good_page = False
            elem.clear()

如果未找到,re.search 将返回 None,而 if 会将其视为 false,因此我们避免写入没有标题的页面以及标题文本与您想要的 RE 不匹配的页面。

关于python元素树迭代解析过滤器节点和子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28253006/

相关文章:

python - ubuntu 上的 cElementTree 出现段错误(核心已转储)

python - 在 python 中循环替换具有不同子字符串的字符串的相同子字符串出现

Python lxml iterparse 按属性排序大型 xml 文件

python - 函数如何接受冒号(范围运算符)作为参数(在 Python 中)?

python - 使用 python 迭代解析大型 XML

python - 使用 Python lxml 和 Iterparse 解析大型 XML 文件

python - 如何获取 cElementTree 中元素的所有文本子项?

python - 使用ElementTree的iterparse方法如何知道元素的父元素?

python - 选择列表中包含的子字符串(没有语法字符)

python - 收集引理及其在字典中的单词