错误';无法加载外部实体';使用Python lxml时

错误';无法加载外部实体';使用Python lxml时,python,xml,lxml,elementtree,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"?> 出现此错误是因为您正在加载的XML引用了外部资源: <?xml-stylesheet type="

我正在尝试解析从web检索的XML文档,但解析后该文档崩溃,出现以下错误:

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

出现此错误是因为您正在加载的XML引用了外部资源:

<?xml-stylesheet type="text/xsl" href="GreenButtonDataStyleSheet.xslt"?>

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

包含一个标题为“”的部分,其中包含您所需的所有信息。

希望
源代码
是其中之一

  • 文件名/路径
  • 文件对象
  • 类似文件的物体
  • 使用HTTP或FTP协议的URL
问题是您将XML内容作为字符串提供

您也可以不使用
urllib2.urlopen()
。只用

tree = etree.parse("http://www.greenbuttondata.org/data/15MinLP_15Days.xml")
演示(使用lxml 2.3.4):


与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))
从lxml导入etree
从StringIO导入StringIO
myString=“诸如此类诸如此类
tree=etree.parse(StringIO(myString))

此方法用于。

lxml docs for parse,表示要从字符串进行解析,请改用
fromstring()
函数。

parse(...)
    parse(source, parser=None, base_url=None)

    Return an ElementTree object loaded with source elements.  If no parser
    is provided as second argument, the default parser is used.

    The ``source`` can be any of the following:

    - a file name/path
    - a file object
    - a file-like object
    - a URL using the HTTP or FTP protocol

    To parse from a string, use the ``fromstring()`` function instead.

    Note that it is generally faster to parse from a file path or URL
    than from an open file object or file-like object.  Transparent
    decompression from gzip compressed sources is supported (unless
    explicitly disabled in libxml2).

您知道是否可以关闭加载所有外部资源?我查看了文档,但找不到任何内容。“您得到了这个错误,因为您正在加载的XML引用了一个外部资源”。不,这不是你出错的原因。请看我的答案。@Duke:谢谢!很高兴终于得到了一些积极的反馈。我在解析URL时遇到了这个错误。知道如何禁用加载那些“外部实体”吗?我对样式表不感兴趣,只想解析页面中的锚。@MightyPork:这个问题实际上不是关于“外部实体”;错误消息具有误导性。这里的问题是OP在字符串对象上使用
etree.parse()
,这不起作用。如果你有相关的问题,我想你应该问一个新问题。@mzjn我确实问了,但我得到的所有建议都是使用不同的库来获取url。我认为您对这个问题有了更多的了解,可以提供帮助。在我的例子中,我出现错误是因为我试图使用parse打开https url。对于python3:
从io导入StringIO
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()   
from lxml import etree
from StringIO import StringIO

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

tree = etree.parse(StringIO(myString))
parse(...)
    parse(source, parser=None, base_url=None)

    Return an ElementTree object loaded with source elements.  If no parser
    is provided as second argument, the default parser is used.

    The ``source`` can be any of the following:

    - a file name/path
    - a file object
    - a file-like object
    - a URL using the HTTP or FTP protocol

    To parse from a string, use the ``fromstring()`` function instead.

    Note that it is generally faster to parse from a file path or URL
    than from an open file object or file-like object.  Transparent
    decompression from gzip compressed sources is supported (unless
    explicitly disabled in libxml2).