python 元素树 iterparse 过滤节点和子节点
python element tree iterparse filter nodes and children
我正在尝试使用 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()
如何添加正则表达式以根据页面的文本属性进行过滤?
您正在寻找 child,而不是属性,因此最简单的方法是在迭代中分析标题 "passes by" 并记住结果,直到得到结果的结尾页数:
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
如果没有找到 return None
, if
将其视为错误,因此我们避免编写没有标题的页面以及标题文本与您想要的 RE 不匹配的那些。
我正在尝试使用 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()
如何添加正则表达式以根据页面的文本属性进行过滤?
您正在寻找 child,而不是属性,因此最简单的方法是在迭代中分析标题 "passes by" 并记住结果,直到得到结果的结尾页数:
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
如果没有找到 return None
, if
将其视为错误,因此我们避免编写没有标题的页面以及标题文本与您想要的 RE 不匹配的那些。