Python lxml错误"命名空间未定义。"

时间:2016-03-18 13:33:06

标签: python xml lxml elementtree

我被一些奇怪形成的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>

由于

1 个答案:

答案 0 :(得分:1)

您的输入文件格式不正确。我假设它是来自更大的XML文档的片段。

您的选择是:

  • 重建较大的文档。如何执行此操作特定于您的应用程序。您可能需要咨询创建您要解析的文件的人员。

  • 尽管存在错误,但仍解析该文件。为此,请使用recover中的lxml.etree.iterparse关键字:

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