我被一些奇怪的xml格式吓到了,不胜感激一些指针:

文档的定义如下:

<sphinx:document id="18059090929806848187">
  <url>http://www.some-website.com</url>
  <page_number>104</page_number>
  <size>7865</size>
</sphinx:document>


现在,我需要读取很多文件(500m +这些文件都是gz压缩的),并从其中包含的一些标签中获取文本值。

样例代码:

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:未定义文档上名称空间前缀狮身人面像,第1行,第20列

请原谅我的无知,但是xml确实伤了我的头,并且我已经为此苦苦挣扎了一段时间。有没有一种方法可以定义名称空间前缀或以其他更智能的方式处理它?

谢谢

最佳答案

您的输入文件格式不正确。我假设这是一个较大的XML文档的摘录。

您的选择是:


重建较大的文档。具体操作方式取决于您的应用程序。您可能需要咨询创建您要分析的文件的人员。
解析文件,尽管存在错误。为此,请使用recover中的lxml.etree.iterparse关键字:

xml2 =etree.iterparse(in_xml, recover=True)

10-01 07:56
查看更多