2017-09-05 10 views
0

何らかの理由で、Scrapyを使用して要素からテキスト値を取得すると正しく表示されますが、配列に配置すると不適切にエンコードされます。スキルエンコーディングデータが間違っています

ここにテストがあります:私はChâteauという単語を使用しました。ある場合には試験で、治療は単語を得て印刷し、それを配列に追加します。 2番目のケースtest2では、別のテストから印刷された単語を文字通りコピーしてコピーします。

value=node.xpath('//AddrDisplayMemberSerialization/text()').extract_first() 
print value; 
array={'test':value,'test2':'Château'} 
print array 

自動的に、配列に値をコード化:

は、ここに私のScrapyのPythonスクリプトです。 Pythonはこれを自動的に行うのですか、それともScrapyはこれをしますか?

enter image description here

そして、なぜ彼らは異なって符号化のですか?

+1

はい。 Pythonは自動的にそれを行います。 Python3 Unicode文字列が正しく表示される – AndMar

+0

@marniだから、Python 3ではすべて正しいでしょうか? –

+1

はい。 Python 2と3は異なる方法でUnicodeで動作します。 – AndMar

答えて

1

でこれを行うにはUTF-8で表示したい場合。あなたはのpython3でこれを行う場合、それはすぐに

Python 3.6.2 (default, Jul 17 2017, 16:44:45) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> value = 'Château' 
>>> print (value) 
Château 
>>> array={'test':value,'test2':'Château'} 
>>> print(array) 
{'test': 'Château', 'test2': 'Château'} 
>>> 

を働くだろうさて、あなたは配列を印刷するとき、それはPythonでのUnicode文字列表現に変換していないので、この問題が発生したバックPython2

Python 2.7.13 (default, Jul 18 2017, 09:17:00) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> value = 'Château' 
>>> print value; 
Château 
>>> array={'test':value,'test2':'Château'} 
>>> print array 
{'test': 'Ch\xc3\xa2teau', 'test2': 'Ch\xc3\xa2teau'} 

を取得してみましょう印刷は、Unicodeエスケープを行う

ている間、あなたが何をしたいのか

>>> str(array) 
"{'test': 'Ch\\xc3\\xa2teau', 'test2': 'Ch\\xc3\\xa2teau'}" 
>>> print str(array) 
{'test': 'Ch\xc3\xa2teau', 'test2': 'Ch\xc3\xa2teau'} 

>>> print str(array).decode("unicode-escape") 
{'test': 'Château', 'test2': 'Château'} 

しかし、これが印刷を乱すのを待つのですか?これは、これらの文字を印刷するために必要なエンコーディングが原因です。短くラテン語

>>> print str(array).decode("unicode-escape").encode("latin-1") 
{'test': 'Château', 'test2': 'Château'} 

ただ、python3にアップグレードすると問題がソートされます。しかし、印刷文をprint(...)に変更する必要があります。または、私が示したコードを使用してエンコードを試してください

1

ターミナルでの表示方法です。

しかし、あなたはそれだけで問題は、Python2とのpython3の違いで起こるsettings.py

FEED_EXPORT_ENCODING = 'utf-8' 
+0

私はこれを試して、それは動作しませんでした。 –

+0

@MaciekSemik私が言ったように、データは端末にUTF-8として表示されませんが、あなたが 'scream crawl spider_name -o output.json'を実行すると、正しいエンコーディングを得ます。 – Umair

+0

私は# - * - coding:utf- - * - –

関連する問題