ExpatのParse Errorから優雅に回復します
-
28-10-2019 - |
質問
XMLは厳格であると想定されるため、XMLでは許可されていないユニコード文字がいくつかあります。しかし、とにかくこれらのキャラクターを含むRSSフィードを使用しようとしています。無効な文字からの解析エラーを避けるか、それらから優雅に回復し、とにかくドキュメントを提示したいと思います。
ここで例を参照してください(とにかく3月21日): http://feeds.feedburner.com/chrisblattman
XMLフィードでUnicodeを処理するための推奨方法は何ですか?文字を検出し、nullバイトで代用して、パーサーを編集するか、その他の方法を編集しますか?
解決
RSSフィードには垂直タブ文字が含まれているように見えます \x0c
これは違法です XML 1.0仕様ごと.
私のアドバイスは、エラーをキャッチして回復しようとするのではなく、データを渡す前に違法な文字を除外することです。違法なユニコード文字を除外するルーチンは次のとおりです。私はそれをあなたにテストしました chrisblattman.xml
RSSフィード:
import re
from xml.parsers import expat
# illegal XML 1.0 character ranges
# See http://www.w3.org/TR/REC-xml/#charsets
XML_ILLEGALS = u'|'.join(u'[%s-%s]' % (s, e) for s, e in [
(u'\u0000', u'\u0008'), # null and C0 controls
(u'\u000B', u'\u000C'), # vertical tab and form feed
(u'\u000E', u'\u001F'), # shift out / shift in
(u'\u007F', u'\u009F'), # C1 controls
(u'\uD800', u'\uDFFF'), # High and Low surrogate areas
(u'\uFDD0', u'\uFDDF'), # not permitted for interchange
(u'\uFFFE', u'\uFFFF'), # byte order marks
])
RE_SANITIZE_XML = re.compile(XML_ILLEGALS, re.M | re.U)
# decode, filter illegals out, then encode back to utf-8
data = open('chrisblattman.xml', 'rb').read().decode('utf-8')
data = RE_SANITIZE_XML.sub('', data).encode('utf-8')
pr = expat.ParserCreate('utf-8')
pr.Parse(data)
アップデート: : ここは ウィキペディアページ XML文字の妥当性について。上記の私のregexpは、C1コントロール範囲を除去しますが、アプリケーションに応じてそれらの文字を許可することをお勧めします。
他のヒント
あなたは試すかもしれません 美しいスープWichは、HTML/XMLドキュメントが十分に形成されていなくても解析される場合があります。
所属していません StackOverflow