错误';无法加载外部实体';使用Python lxml时
我正在尝试解析从web检索的XML文档,但解析后该文档崩溃,出现以下错误:错误';无法加载外部实体';使用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="
': 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).