4

間違った機能を使ったようです。-で.fromstring-エラーメッセージはありません

xml_ = load() # here comes the unicode string with Cyrillic letters 

print xml_    # prints everything fine 

print type(xml_) # 'lxml.etree._ElementUnicodeResult' = unicode 

xml = xml_.decode('utf-8') # here is an error

doc = lxml.etree.parse(xml) # if I do not decode it - the same error appears here

 File "testLog.py", line 48, in <module>
    xml = xml_.decode('utf-8')
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 89-96: ordinal not in range(128)

もしも

xml = xml_.encode('utf-8')

doc = lxml.etree.parse(xml) # here's an error

また

xml = xml_

それから

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 89: ordinal not in range(128)

私がそれを正しく理解している場合:非ASCII文字列を内部表現にデコードしてから、この表現を操作して、出力に送信する前にエンコードし直す必要がありますか?私はまさにこれをしているようです。

'Accept-Charset': 'utf-8'ヘッダーがあるため、入力データはunt-8である必要があります。

4

5 に答える 5

6

文字列オブジェクトとUnicodeオブジェクトには、メモリ内のコンテンツのタイプと表現が異なります。Unicodeはデコードされたテキスト形式であり、stringはエンコードされた形式です。

# -*- coding: utf-8 --

# Now, my string literals in this source file will
#    be str objects encoded in utf-8.

# In Python3, they will be unicode objects.
#    Below examples show the Python2 way.

s = 'ş'
print type(s) # prints <type 'str'>

u = s.decode('utf-8')
# Here, we create a unicode object from a string
#    which was encoded in utf-8.

print type(u) # prints <type 'unicode'>

ご覧のとおり、

.encode() --> str
.decode() --> unicode

文字列にエンコードまたは文字列からデコードするときは、テキストがソース/ターゲットエンコーディングでカバーされていることを確認する必要があります。iso-8859-1でエンコードされた文字列は、iso-8859-9では正しくデコードできません。

質問の2番目のエラーレポートについては、lxml.etree.parse()ファイルのようなオブジェクトで機能します。文字列から解析するには、lxml.etree.fromstring()を使用する必要があります。

于 2012-07-08T18:21:17.577 に答える
2

元の文字列がUnicodeの場合は、utf-8からデコードするのではなく、utf-8にエンコードするだけで意味があります。

xmlパーサーはASCIIであるxmlのみを処理できると思います。

したがってxml = xml_.encode('ascii','xmlcharrefreplace')、ASCIIにないUnicode文字をxmlエンティティに変換するために使用します。

于 2012-07-08T17:56:53.677 に答える
1

lxmlライブラリはすでにUnicodeタイプのものを用意しています。あなたはpython2のユニコード/バイトの自動変換に遭遇しています。そのためのヒントは、要求しているdecodeのにエンコードエラーが発生しているということです。utf8文字列をデフォルトのバイトエンコーディングに変換してから、Unicodeにデコードして戻そうとしています。

Unicodeオブジェクトで.encodeメソッドを使用して、バイト(str型)に変換します。

これを見ると、この問題を解決する方法について多くのことがわかります:http: //nedbatchelder.com/text/unipain.html

于 2012-07-08T17:58:14.113 に答える
1

私はあなたがいくつかのウェブサイトを解析しようとしていると思いますか?

Webサイトが正しいことを検証しましたか?たぶん彼らはエンコーディングが間違っていますか?

多くのWebサイトは壊れており、非常に堅牢なパーサーを持つためにWebブラウザーに依存しています。あなたは美しいスープを試してみることができます、それはまた非常に頑丈です。

「Charset」HTMLヘッダー(ネゴシエーションを含み、言及したAccept-Encodingに関連する)がHTMLファイル内のタグによって無効にされる<meta http-equiv=...という事実上のWeb標準があります。

したがって、UTF-8入力がない可能性があります。

于 2012-07-08T18:06:54.397 に答える
1

私にとって、.fromstring()メソッドを使用することが必要でした。

于 2014-03-18T20:15:01.173 に答える