如何在Python中增量解析超大XML文件并提取完整文本
处理超大XML文件时增量提取完整文本的问题
问题背景
我有一些超过6GB的超大XML文件,需要从中提取文本。问题在于文本被其他标签打断,示例文件如下:
<doc> <s> Here you can see a <ref target="SOME_URL" targOrder="u">reference</ref> in the text. </s> </doc>
我期望得到的结果是:
Here you can see a reference in the text.
当前尝试的代码及问题
我使用增量解析的方式处理,但只能提取到被标签打断前的部分文本:
import xml.etree.ElementTree as ET for event, element in ET.iterparse(path): if element.tag == "doc": # do something here elif element.tag == "s" and type(element.text) == str: if element.text.strip(): # again do something here element.clear()
应用到示例文件后得到的结果是:
Here you can see a
我知道使用itertext()可以获取完整文本,比如:
import xml.etree.ElementTree as ET myxml = '<doc><s> Here you can see a <ref target="SOME_URL" targOrder="u">reference</ref> in the text. </s></doc>' tree = ET.fromstring(myxml) print(''.join(tree.itertext()))
输出:
Here you can see a reference in the text.
但由于文件过大,无法一次性解析为树结构。而增量解析时,解析到<s>标签时,后续的<ref>标签还未被解析,导致itertext()无法正常工作。
编辑补充:尝试后的问题
尝试第一个答案后,文本仍会被标签打断(和之前一样),参考代码如下:
for event, element in ET.iterparse(path): if element.tag == "idsText": # move sentences from stack if sents: cat_texts.extend(sents) visited[current_doc] = visited.get(current_doc, 0) + 1 # another function call annotate(cat_texts, filename, current_doc, visited[current_doc]) # reset cat_texts cat_texts = [] # set new current document's name current_doc = element.get("n") sents = [] # new sentence starts elif element.tag == "s" and type(element.text) == str: if element.text.strip(): sentence = ' '.join(element.itertext()) new_sent.extend(nltk.word_tokenize(sentence, language='german')) sents.append(new_sent) new_sent = [] element.clear()
提问
请问有没有办法在增量解析时提取元素内的完整文本并去除标签?
内容的提问来源于stack exchange,提问作者user21871257
相关产品推荐
相关产品推荐

