【问题标题】:How to read an xml file with & sign如何使用 & 符号读取 xml 文件
【发布时间】:2016-08-28 14:22:21
【问题描述】:

这是我的xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE papers>
<papers>
  <paper>
    <title>Title containing & and more</title>
  </paper>
</papers>

我如何使用lxmletree 阅读?我试过了

from lxml import etree

with open(xml_file, 'r') as inf:
    tree = etree.parse(inf)

但它会导致以下 Traceback:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "lxml.etree.pyx", line 3239, in lxml.etree.parse (src/lxml/lxml.etree.c:69955)
  File "parser.pxi", line 1769, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:102257)
  File "parser.pxi", line 1789, in lxml.etree._parseFilelikeDocument (src/lxml/lxml.etree.c:102516)
  File "parser.pxi", line 1684, in lxml.etree._parseDocFromFilelike (src/lxml/lxml.etree.c:101442)
  File "parser.pxi", line 1134, in lxml.etree._BaseParser._parseDocFromFilelike (src/lxml/lxml.etree.c:97069)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:91275)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:92461)
  File "parser.pxi", line 622, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:91757)
lxml.etree.XMLSyntaxError: xmlParseEntityRef: no name, line 5, column 30

【问题讨论】:

  • 我通过 xmllint 运行了您的 XML 文件,并在 & 符号处出现错误。这意味着您的 XML 格式不正确。
  • &amp;amp;转义
  • 我无法更改文件。
  • @MERose, ...文件错误。正如现在所写的那样,它不是有效的 XML,因此不是真正的“XML 文件”。使用创建它的任何软件提交错误。

标签: python parsing lxml


【解决方案1】:

如果需要保留&amp; 字符,可以将文件解析为HTML。

from lxml import html
tree = html.parse(path)

如果您不需要需要&amp; 字符,您可以创建一个新的XML 解析器并传递recover=True 选项。

from lxml import etree
parser = etree.XMLParser(recover=True)
tree = etree.parse(path, parser=parser)

【讨论】:

    【解决方案2】:

    由于 xml 文件格式不正确,由于 ampersand(预定义的 xml 实体),请尽可能使用 BeautifulSoup。它是一个更容错的解析器。

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(data)
    print soup.find("title").text
    

    输出

    Title containing & and more
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多