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文档.
mzj*_*zjn 12
etree.parse(source)期待source成为其中之一
问题是您将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)
您收到该错误是因为您正在加载的 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 解析”的部分,其中几乎包含您需要的所有信息。
| 归档时间: |
|
| 查看次数: |
27234 次 |
| 最近记录: |