2015-10-25 2 views
5

GoogleのジオコーディングAPIで使用する文字列を取得しようとしています。多くのスレッドをチェックしましたが、まだ問題に直面しており、解決方法がわかりません。Python 3.5でアクセントを削除し、ユニコードデータなどのソリューションで文字列を取得するにはどうすればよいですか?

私はaddresse1が特殊文字のない文字列である必要があります。 Addresse1は、例えば、「32 rue d'AthènesParis France」である。

addresse1= collect.replace(' ','+').replace('\n','') 
addresse1=unicodedata.normalize('NFKD', addresse1).encode('utf-8','ignore') 

ここにはアクセントのない文字列があります。ホー...文字列ではなくバイトです。だから私は何を示唆されたおよび「復号をやった:

addresse1=addresse1.decode('utf-8') 

しかし、その後addresse1が初めに比べてまったく同じです...私は何をしなければなりませんの?私は間違って何をしていますか?または私はユニコードで理解できないものは何ですか?または、より良い解決策がありますか?ありがとう、

ステファン。

+0

[実用的なUNICODE](http://nedbatchelder.com/text/unipain/:あなたが持っているべきではありませんので、とにかくjson.loadは、すべての文字列にデータをロードするために、ファイルのようなオブジェクトから直接読み込みますunipain.html#1)と[すべてのソフトウェア開発者が絶対に最低限必要な、絶対にUnicodeと文字セットについて知っておく必要がある](http://www.joelonsoftware.com/articles/Unicode.html) 'エンコード'と 'デコード'とは何ですか(そしてなぜ彼らはあなたがここで望んでいるものでないのですか)。一般的に、文字列中のすべての文字を表すことができるエンコーディングを使用していると仮定して、* mystring.encode(my_encoding).decode(my_encoding)== mystring'を期待するべきです。 – lvc

+0

より良い解決策は、Unicodeを正しく処理するようにプログラムを修正することです。あなたが扱う方法を知らないデータを放棄することは決して良い解決策ではありません。 :)それでは、lvcのリンクを見てください。 –

答えて

13

unidecode

3>> unidecode.unidecode("32 rue d'Athènes Paris France") 
"32 rue d'Athenes Paris France" 
0

pythonのtranslate()メソッドを使用できます。

#!/usr/bin/python 

from string import maketrans # Required to call maketrans function. 

intab = "aeiou" 
outtab = "12345" 
trantab = maketrans(intab, outtab) 

str = "this is string example....wow!!!"; 
print str.translate(trantab) 

この出力:ここ がtutorialspoint.comからコピーされた例です

th3s 3S str3ng 2x1mpl2 .... w4w !!!

だからあなたは(あなたがreplace()

+0

intabにアクセント文字がある場合、これは機能しません。 intab = "äeiou"で試してください。 – Raja

1

addresse1 = unicodedata.normalize( 'NFKD'、addresse1).encodeでより簡単により交換したいどのような文字を定義することができます'utf-8'、 'ignore')

おそらく、.encode('ascii', 'ignore')、非ASCII文字を削除します。 UTF-8にはすべての文字が含まれているため、エンコードには何も取り除かれず、エンコードデコードサイクルはノーオペレーションです。

もっと良い解決策がありますか?

これは、実行することによって異なります。

あなたが唯一の発音記号を削除し、他のすべての非ASCII文字を失わないしたい場合は、NFKD、正規化後の各文字のunicodedata.categoryを読むことができたし、あなたが翻字にしたい場合は、カテゴリM.

のものを削除しますカスタム置換が必要な言語固有の質問になるASCII(たとえば、öoeになりますが、スウェーデン語にはなりません)。

ASCII以外の文字を使用するとコードが破損するため、文字列をASCIIに変更したい場合は、そのコードを修正してすべてのUnicode文字が正常に動作するようにするのはもちろんです。文字èはASCIIではエンコードできませんが、どちらも99ではありません。すべての文字の9989%が「特別」になることはほとんどありません。 ASCIIのみをサポートしているコードは不足しています。

GoogleジオコーディングAPIは、Unicodeと完全によく機能するため、これを行う必要がある明らかな理由はありません。

ETA:

url2= 'maps.googleapis.com/maps/api/geocode/json?address=' + addresse1 ... 

ああ、あなたはURLに注入任意のデータをエンコードしURLする必要があります。これはUnicodeだけではありません。上のコードは多くのASCII句読記号でも破損します。複数のパラメータに変換するために、単一の文字列、またはurllib.encodeをエンコードするためにurllib.quoteを使用します。

params = dict(
    address=address1.encode('utf-8'), 
    key=googlekey 
) 
url2 = '...?' + urllib.urlencode(params) 

を(。Pythonの3で、それはurllib.parse.quoteurllib.parse.encodeだと、彼らは自動的ので、手動でそこにエンコードする必要はありませんUTF-8を選択してください)

data2 = urllib.request.urlopen(url2).read().decode('utf-8') 
data3=json.loads(data2) 

json.loadsは、UTF-8デコードを省略しても安全です。

data3 = json.load(urllib.request.urlopen(url2)) 
+0

OK。おそらく、私は自分のコードで間違った方法をとっているからです:url2 = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + addresse1 + '&key =' + googlekey \t data2 @Sulot:[返信で返信された返信] @ urlib.request.urlopen(url2).read()。decode( 'utf-8') \t data3 = json.loads(data2) – Sulot

+0

@Sulot: – bobince

関連する問題