我被一些奇怪形成的xml驱使疯狂,并会感激一些指示:
文件的定义如下:
<sphinx:document id="18059090929806848187">
<url>http://www.some-website.com</url>
<page_number>104</page_number>
<size>7865</size>
</sphinx:document>
现在,我需要阅读很多(500万以上这些文件都是gz compresed)并从一些包含的标签中获取文本值。
示例代码:
from lxml import objectify, etree
import gzip
with open ('file_list','rb') as file_list:
for file in file_list:
in_xml = gzip.open(file.strip('\n'))
xml2 = etree.iterparse(in_xml)
for action, elem in xml2:
if elem.tag == "page_number":
print elem.text + str(file)
返回第一个值elem.text但仅针对列表中的第一个文件,然后很快出现错误:
lxml.etree.XMLSyntaxError:未定义文档上的命名空间前缀sphinx,第1行,第20列
请原谅我的无知,但xml确实伤到了我的头脑,我一直在努力解决这个问题。有没有办法可以定义命名空间前缀或以其他更智能的方式处理它?</ p>
由于
答案 0 :(得分:1)
您的输入文件格式不正确。我假设它是来自更大的XML文档的片段。
您的选择是:
重建较大的文档。如何执行此操作特定于您的应用程序。您可能需要咨询创建您要解析的文件的人员。
尽管存在错误,但仍解析该文件。为此,请使用recover
中的lxml.etree.iterparse
关键字:
xml2 =etree.iterparse(in_xml, recover=True)