我需要在目录中解析带有xml标记的txt文件(我已经使用glob创建了一个语料库),但是etree parse一次只允许一个文件。如何设置循环以一次解析所有文件?然后,目标是使用请求将这些文件添加到Elasticsearch。这就是我到目前为止所做的:
import json
import os
import re
from lxml import etree
import xmltodict
import glob
corpus=glob.glob('path/*.txt')
ns=dict(tei="http://www.tei-c.org/ns/1.0")
tree = etree.ElementTree(file='path/file.txt')
doc = {
"author": tree.xpath('//tei:author/text()', namespaces=ns)[0],
"title": tree.xpath('//tei:title/text()', namespaces=ns)[0],
"content": "".join(tree.xpath('//tei:text/text()', namespaces=ns))
}
答案 0 :(得分:1)
只需迭代corpus
列表即可。但是,您需要使用诸如列表或字典之类的容器来保存单独解析的数据。下面假定.txt文件是格式良好的.xml文件并保持相同的结构,包括tei
命名空间:
import os, glob
from lxml import etree
corpus = glob.glob('path/*.txt')
ns = dict(tei="http://www.tei-c.org/ns/1.0")
xmlList = []; xmlDict = {}
for file in corpus:
tree = etree.parse(file)
doc = {
"author": tree.xpath('//tei:author/text()', namespaces=ns)[0],
"title": tree.xpath('//tei:title/text()', namespaces=ns)[0],
"content": "".join(tree.xpath('//tei:text/text()', namespaces=ns))
}
# LIST OF DOC DICTS
xmlList.append(doc)
# DICTIONARY OF DOC DICTS, KEY IS FILE NAME
key = os.path.basename(file).replace('.txt', '')
xmlDict[key] = doc