使用Python lxml时出错"加载外部实体失败"

dav*_*loo 22 python xml lxml elementtree

我正在尝试解析从Web检索的XML文档,但在解析此错误后崩溃了:

': failed to load external entity "<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="GreenButtonDataStyleSheet.xslt"?>
Run Code Online (Sandbox Code Playgroud)

这是下载的XML中的第二行.有没有办法阻止解析器尝试加载外部实体,或者另一种方法来解决这个问题?这是我到目前为止的代码:

import urllib2
import lxml.etree as etree

file = urllib2.urlopen("http://www.greenbuttondata.org/data/15MinLP_15Days.xml")
data = file.read()
file.close()

tree = etree.parse(data)
Run Code Online (Sandbox Code Playgroud)

kev*_*vin 22

与mzjn所说的一致,如果你想将字符串传递给etree.parse(),只需将其包装在StringIO对象中.

例:

from lxml import etree
from StringIO import StringIO

myString = "<html><p>blah blah blah</p></html>"

tree = etree.parse(StringIO(myString))
Run Code Online (Sandbox Code Playgroud)

此方法用于lxml文档.

  • 对于python3:`来自io import StringIO` (11认同)

mzj*_*zjn 12

etree.parse(source)期待source成为其中之一

  • 文件名/路径
  • 一个文件对象
  • 一个类似文件的对象
  • 使用HTTP或FTP协议的URL

问题是您将XML内容作为字符串提供.

你也可以不用urllib2.urlopen().只是用

tree = etree.parse("http://www.greenbuttondata.org/data/15MinLP_15Days.xml")
Run Code Online (Sandbox Code Playgroud)

演示(使用lxml 2.3.4):

>>> from lxml import etree
>>> tree = etree.parse("http://www.greenbuttondata.org/data/15MinLP_15Days.xml")
>>> tree.getroot()
<Element {http://www.w3.org/2005/Atom}feed at 0xedaa08>
>>>   
Run Code Online (Sandbox Code Playgroud)

竞争的答案中,由于文档中处理指令引用的样式表,建议lxml失败.但这不是问题所在.lxml不会尝试加载样式表,如果您按上述方法执行,则会解析XML文档.

如果要实际加载样式表,则必须明确它.需要这样的东西:

from lxml import etree

tree = etree.parse("http://www.greenbuttondata.org/data/15MinLP_15Days.xml")

# Create an _XSLTProcessingInstruction object
pi = tree.xpath("//processing-instruction()")[0] 

# Parse the stylesheet and return an ElementTree
xsl = pi.parseXSL()   
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,我收到错误,因为我试图用 parse 打开一个 https url。 (2认同)

lar*_*sks 2

您收到该错误是因为您正在加载的 XML 引用了外部资源:

<?xml-stylesheet type="text/xsl" href="GreenButtonDataStyleSheet.xslt"?>
Run Code Online (Sandbox Code Playgroud)

LXML 不知道如何解析GreenButtonDataStyleSheet.xslt. 你和我可能意识到它将相对于你的原始 URL 可用,http://www.greenbuttondata.org/data/15MinLP_15Days.xml...技巧是告诉lxml如何加载它。

lxml文档包括标题为“文档加载和 URL 解析”的部分,其中几乎包含您需要的所有信息。