未定義のエンティティを含むXHTML5を解析します

シータ

これを考慮してください:

import xml.etree.ElementTree as ET

xhtml = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
        <head><title>XHTML sample</title></head>
            <body>
                <p>&nbsp;Sample text</p>
            </body>
        </html>
'''
parser = ET.XMLParser()
parser.entity['nbsp'] = '&#x00A0;'
tree = ET.fromstring(xhtml, parser=parser)
print(ET.tostring(tree, method='xml'))

これは、xhtml文字列の優れたテキスト表現をレンダリングします。

ただし、HTML5 doctypeを持つ同じXHTMLドキュメントの場合:

xhtml = '''<!DOCTYPE html>
        <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
        <head><title>XHTML sample</title></head>
            <body>
                <p>&nbsp;Sample text</p>
            </body>
        </html>
'''

例外が発生します:

xml.etree.ElementTree.ParseError: undefined entity: line 5, column 19

そのため、nbspエンティティdictに追加ましたが、パーサーはそれを処理できません

私が使用した場合も同じことが起こりますlxml

from lxml import etree
parser = etree.XMLParser(resolve_entities=False)
tree = etree.fromstring(xhtml, parser=parser)
print etree.tostring(tree, method='xml')

上げる:

lxml.etree.XMLSyntaxError: Entity 'nbsp' not defined, line 5, column 26

エンティティを無視するようにパーサーを設定しましたが。

これはなぜですか。また、HTML5 doctype宣言を使用してXHTMLファイルの解析を可能にする方法を教えてください。


lxmlの部分的な解決策は、recovererを使用することです。

parser = etree.XMLParser(resolve_entities=False, recover=True)

しかし、私はまだより良いものを待っています。

ウラジミール・パラント

ここでの問題は、バックグラウンドで使用されるExpatパーサーは通常、不明なエンティティを報告しないことです。エラーをスローするため、xml.etree.ElementTreeトリガーしようとしたフォールバックコードは実行されません。このUseForeignDTDメソッド使用してこの動作を変更できます。これにより、Expatはdoctype宣言を無視し、すべてのエンティティ宣言をに渡しますxml.etree.ElementTree次のコードは正しく機能します。

import xml.etree.ElementTree as ET

xhtml = '''<!DOCTYPE html>
        <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
        <head><title>XHTML sample</title></head>
            <body>
                <p>&nbsp;Sample text</p>
            </body>
        </html>
'''
parser = ET.XMLParser()
parser._parser.UseForeignDTD(True)
parser.entity['nbsp'] = u'\u00A0'
tree = ET.fromstring(xhtml, parser=parser)
print(ET.tostring(tree, method='xml'))

このアプローチの副作用:私が言ったように、doctype宣言は完全に無視されます。これは、Doctypeでカバーされていると思われるエンティティも含め、すべてのエンティティを宣言する必要があることを意味します。

ElementTree.XMLParser.entity辞書に入力する値は通常の文字列である必要があることに注意してください。エンティティが置き換えられるテキストです。他のエンティティを参照することはできなくなります。だからそれはのu'\u00A0'ためでなければなりません&nbsp;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

XMLを変更せずにJavaでHTMLエンティティを含むXMLファイルを解析する

分類Dev

Hibernate:CollectionOfElementsに指定された要素を含むエンティティをクエリしますか?

分類Dev

JPAエンティティを含むSpringのLazyInitializationException

分類Dev

JavaでHTML文字エンティティを含むXMLの解析に失敗しました

分類Dev

Spring DataRepositoriesのリストで文字列を含むエンティティを検索します

分類Dev

教義は動的にエンティティを作成します

分類Dev

エンティティセットでToList()を呼び出すEF Linq to Entitiesは、複数の左外部結合を含むSQLコマンドを生成します

分類Dev

ElementTreeを使用した標準エンティティを含むXHTMLの解析

分類Dev

javascriptのhtmlエンティティを含むjsonencondedオブジェクトの解析

分類Dev

複数の単語を含むエンティティを追加する方法

分類Dev

同じエンティティMVCコアを含む1エンティティでDboを作成します

分類Dev

Spring DataMongoDBを使用してMongoDBの埋め込み配列から要素のサブリストを含むエンティティを検索します

分類Dev

複数のエンコーディングを使用して列を含むテーブルを生成します

分類Dev

空間querydsl-GeometryExpressions。指定された「ポイント」を含む範囲のエンティティを検索します

分類Dev

mongodbの個別のフィールドに関連する属性の数を含むエンティティをクエリします

分類Dev

Restサービスは、IDを含むエンティティを他のエンティティまたはエンティティ自体に返す必要がありますか?

分類Dev

別のエンティティタイプのリストを含むSpringDataJPAにエンティティを保存します

分類Dev

@ManyToOneを含むエンティティの削除中にJPAエラーが発生しました

分類Dev

JPAエンティティは@Idを含むクラスを拡張します

分類Dev

複数の文字エンティティを含むXMLを解析する方法は?

分類Dev

EFLINQ-コレクション全体を含むエンティティを返します

分類Dev

PHPでjsonを解析します。未定義のプロパティの取得:stdClassエラー

分類Dev

親をプロパティとして含むエンティティのリストをロードする

分類Dev

2つの列挙を含むエンティティですが、Hibernateは永続化された値を乗算します

分類Dev

エンティティを含め、asp.netエンティティの異なるテーブルからのデータをカウントします

分類Dev

Htmlを変更したりHtmlエンティティを解析したりせずにjsoupでxhtmlを解析する方法

分類Dev

エンティティIDを含む@RequestBody属性をSpringの対応するエンティティに変換します

分類Dev

XSLは、要素名に文字エンティティを含むxmlを変換します

分類Dev

別の既存のエンティティを含む新しいエンティティを作成する

Related 関連記事

  1. 1

    XMLを変更せずにJavaでHTMLエンティティを含むXMLファイルを解析する

  2. 2

    Hibernate:CollectionOfElementsに指定された要素を含むエンティティをクエリしますか?

  3. 3

    JPAエンティティを含むSpringのLazyInitializationException

  4. 4

    JavaでHTML文字エンティティを含むXMLの解析に失敗しました

  5. 5

    Spring DataRepositoriesのリストで文字列を含むエンティティを検索します

  6. 6

    教義は動的にエンティティを作成します

  7. 7

    エンティティセットでToList()を呼び出すEF Linq to Entitiesは、複数の左外部結合を含むSQLコマンドを生成します

  8. 8

    ElementTreeを使用した標準エンティティを含むXHTMLの解析

  9. 9

    javascriptのhtmlエンティティを含むjsonencondedオブジェクトの解析

  10. 10

    複数の単語を含むエンティティを追加する方法

  11. 11

    同じエンティティMVCコアを含む1エンティティでDboを作成します

  12. 12

    Spring DataMongoDBを使用してMongoDBの埋め込み配列から要素のサブリストを含むエンティティを検索します

  13. 13

    複数のエンコーディングを使用して列を含むテーブルを生成します

  14. 14

    空間querydsl-GeometryExpressions。指定された「ポイント」を含む範囲のエンティティを検索します

  15. 15

    mongodbの個別のフィールドに関連する属性の数を含むエンティティをクエリします

  16. 16

    Restサービスは、IDを含むエンティティを他のエンティティまたはエンティティ自体に返す必要がありますか?

  17. 17

    別のエンティティタイプのリストを含むSpringDataJPAにエンティティを保存します

  18. 18

    @ManyToOneを含むエンティティの削除中にJPAエラーが発生しました

  19. 19

    JPAエンティティは@Idを含むクラスを拡張します

  20. 20

    複数の文字エンティティを含むXMLを解析する方法は?

  21. 21

    EFLINQ-コレクション全体を含むエンティティを返します

  22. 22

    PHPでjsonを解析します。未定義のプロパティの取得:stdClassエラー

  23. 23

    親をプロパティとして含むエンティティのリストをロードする

  24. 24

    2つの列挙を含むエンティティですが、Hibernateは永続化された値を乗算します

  25. 25

    エンティティを含め、asp.netエンティティの異なるテーブルからのデータをカウントします

  26. 26

    Htmlを変更したりHtmlエンティティを解析したりせずにjsoupでxhtmlを解析する方法

  27. 27

    エンティティIDを含む@RequestBody属性をSpringの対応するエンティティに変換します

  28. 28

    XSLは、要素名に文字エンティティを含むxmlを変換します

  29. 29

    別の既存のエンティティを含む新しいエンティティを作成する

ホットタグ

アーカイブ