1

xml.etree.ElementTreePython 3でXHTMLドキュメントを解析するために使用したい。ドキュメントには エンティティが含まれているため、デフォルトのパーサー設定を使用できません。私は次のようなことをしたいと思います:

with urllib.request.urlopen(BASE_URL) as url:
        body = url.read()
        parser = ET.XMLParser()
        parser.parser.UseForeignDTD(True)
        parser.entity.update(entitydefs)
        etree = ET.ElementTree()
        root = etree.fromstring(body)

ただし、fromstringは無料の関数ですElementTreeElementTreeインスタンスと同様のことをどのように達成できますか?

4

2 に答える 2

2

さて、私は同じ問題に遭遇しました。質問のサンプル コードと選択した回答は以前は機能していた可能性がありますが、現在は Python 3.3 および Python 3.4 環境では機能しません。

私はついにそれを働かせました。このQ&Aより引用。

この投稿に触発されて、XML 定義を受信した生の HTML コンテンツの前に追加するだけで、ElementTree はすぐに機能します。

これは、Python 2.6、2.7、3.3、3.4 の両方で機能します。

import xml.etree.ElementTree as ET

html = '''<html>
    <div>Some reasonably well-formed HTML content.</div>
    <form action="login">
    <input name="foo" value="bar"/>
    <input name="username"/><input name="password"/>

    <div>It is not unusual to see &nbsp; in an HTML page.</div>

    </form></html>'''

magic = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
            <!ENTITY nbsp ' '>
            ]>'''  # You can define more entities here, if needed

et = ET.fromstring(magic + html)
于 2016-02-24T01:18:58.663 に答える
1

パーサーにフィードします。

with urllib.request.urlopen(BASE_URL) as url:
    body = url.read()
    parser = ET.XMLParser()
    parser.parser.UseForeignDTD(True)
    parser.entity.update(entitydefs)
    parser.feed(body)
    root = parser.close()   # this returns you the tree
于 2013-03-02T19:07:22.120 に答える