【问题标题】:how to parse the second xml tree in a file如何解析文件中的第二个xml树
【发布时间】:2012-02-22 03:57:15
【问题描述】:

假设我有一个类似的 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<items>
  <?xml version="1.0" encoding="utf-8"?>
  <items>
    <item>
      <price>1500</price>
      <info> asfgfdff</info>
    </item>
  </items>

如何解析,以便解析器选择最近更新的 xml 树?

【问题讨论】:

  • 您是从字面上重复前两行还是只是复制和粘贴错误?
  • 我可能弄错了,但我很确定 xml 文件不能有多个声明 (...?>),除非它们包含在 CDATA 部分中。
  • 是的,我从字面上重复它。每当我爬过一个网站时,我都会将它保存在一个文件中。所以,当我尝试解析它时,我会收到这个错误lxml.etree.XMLSyntaxError: XML declaration allowed only at the start of the document, line 2, column 6
  • 我的意思是提取的数据是这样保存的
  • 就像 João Lourenço 所说,双 XML 序言声明不是有效的 XML。这正是 lxml 解析器告诉您的内容:“”,它在抱怨第二个 xml 声明。这更像是一种 XML 汤,因此在您更正保存数据的方式之前,您将无法解析它。

标签: python xml lxml scrapy


【解决方案1】:
with open('file','r') as f:
    newestXml = []
    for line in f.readlines():
        if re.search('^<\?xml',line):
            newestXml = [line]
        else:
            newestXml.append(line)

在循环结束时,newestXml 将包含从最后一次出现 &lt;?xml 到文件末尾的所有行。 现在您可以合并这些行并使用 xml 解析器来解析 xml。

注意 - 我现在无法检查此代码,因此它可能包含一些小错误,但我希望这个想法对您有所帮助。

【讨论】:

  • 对此不确定 - latestXml 将包含“内部” xml 文档以及“外部”文档的结束标签,例如项目>)。将正则表达式与 XML 一起使用是一堆蠕虫!
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多