30

Web から取得した XML ドキュメントを解析しようとしていますが、解析後に次のエラーでクラッシュします。

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

これは、ダウンロードされる XML の 2 行目です。パーサーが外部エンティティをロードしようとするのを防ぐ方法、またはこれを解決する別の方法はありますか? これは私がこれまでに持っているコードです:

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)
4

4 に答える 4

30

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 ドキュメントで使用されています。

于 2012-10-20T01:13:14.110 に答える
4

解析用のlxmlドキュメントには、文字列から解析するには、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).
于 2013-06-25T20:00:35.377 に答える
2

読み込んでいる XML が外部リソースを参照しているため、このエラーが発生しています。

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

LXML は を解決する方法を知りませんGreenButtonDataStyleSheet.xslt。あなたと私はおそらく、元の URL に関連して利用できるようになることを認識していますhttp://www.greenbuttondata.org/data/15MinLP_15Days.xml...秘訣は、lxmlそれをロードする方法を伝えることです。

lxmlのドキュメントには、「ドキュメントの読み込みと URL の解決」というタイトルのセクションが含まれており、必要なほぼすべての情報が含まれています。

于 2012-05-05T00:38:49.020 に答える