3

XMLは厳密であると想定されているため、XMLで許可されていないUnicode文字がいくつかあります。ただし、とにかくこれらの文字が含まれることが多いRSSフィードを使用しようとしています。無効な文字からの解析エラーを回避するか、無効な文字から適切に回復して、とにかくドキュメントを表示したいと思います。

ここで例を参照してください(とにかく3月21日): http: //feeds.feedburner.com/chrisblattman

XMLフィードでUnicodeを処理するための推奨される方法は何ですか?文字を検出してnullバイトに置き換えたり、パーサーを編集したり、その他の方法を実行したりしますか?

4

2 に答える 2

4

その RSS フィードには、XML 1.0 仕様\x0cでは違法な垂直タブ文字が含まれていたようです。

私のアドバイスは、エラーをキャッチして回復しようとするのではなく、expat にデータを渡す前に不正な文字を除外することです。不正な Unicode 文字を除外するルーチンを次に示します。あなたのchrisblattman.xmlRSS フィードでテストしました:

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 文字の有効性に関するウィキペディアのページを次に示します。上記の正規表現は C1 制御範囲を除外しますが、アプリケーションによってはこれらの文字を許可したい場合があります。

于 2011-03-21T20:44:20.497 に答える
1

整形式でなくてもHTML/XMLドキュメントを解析できるBeautifulSoupを試してみ てください。

于 2011-03-21T20:39:03.187 に答える