Google Safe Browsing ListにCSVから取得したマルチバイト文字を含んだURLを渡す
お詫び
Qiitaの元記事にて、区切り線を「---」で書いている場所があり、これがZennの記法に干渉して一部うまく表示できない記事がある事を認識しています。
全ての記事を精査しきれていないため、お手数ですがお見かけの際は教えていただけると大変喜びます。
Python2.7でやってます。3系はもっと簡単に出来そう。
ソースコード
from urlparse import urlparse
import urllib
def toGSBL(str_url, character_code)
scheme, netloc, path, params, query, fragments = urlparse(unicode(str_url, character_code, 'ignore'))
netloc = netloc.encode('idna')
path = urllib.quote_plus(path.encode('utf-8'), '') if len(path) > 0 else '/'
query = urllib.quote_plus(query.encode('utf-8'), '') if len(query) > 0 else ''
return scheme + '://' + netloc + path + query
- urlparseして必要なところを細工したらくっつけてるだけです。
- charactor_codeにshift-jisとかutf-8とか入れれば思い思いに使えます。
- pathやqueryなど他にもマルチバイト文字が含まれていることを想定していますが、ここで欲しいのはあくまでnetlocをpunycodeにしたものです。
- 文字コードにもよりますが、日本語・韓国語・中国語で期待した結果が得られたので大体できると思いますが確認していません。
ハマりポイント
UnicodeDecodeError、UnicodeEncodeErrorにはすっごく悩まされました…
というのも、urlparseをするのに環境の都合上どうしてもstr-unicode変換を強いられるため、その辺りの関係をきちんと理解しておかないとだめでした。
普段文字コードを気にしないで開発しているとこういう細かいところでハマります。
楽にするなら文頭に「# -- coding: utf-8 --」とか書ければいいんですが、今回はそれはナシということでこの形で実現しています。
あと、URLLIBを知らない場合は便利だから見ておいたほうがいいと思います。
参考
敬称略
大変助かりました!
Pythonで日本語を含む国際化ドメイン(IDNA)をPunycode変換する(ServersMan@VPS(CentOS)でお気楽サーバー運営 (^^♪ (忘れっぽいので個人メモ用))
日本語文字列コード問題まとめ ニホンジンは文字コードにうるさい(PythonMatrixJp for Pythonista!)
20.16. urlparse — Parse URLs into components(Python 2.7.14 Documentation)
urllib.parse.quote関数使用時の注意(@FGtatsuro)
urllib – ネットワークリソースへのシンプルなインタフェース(PyMOTW)
pythonで三項演算子のネスト(@u1and0)
Discussion