日本語を含むURLでつまづく
本の中で、課題としてWikipedia(英語版)を使ったものが出てきたので、日本版Wikipediaに置き換えてやってみようと思ったところ、URLに日本語が含まれているせいでUnicodeエンコードエラーが起きた。 ググったところ、先人の知恵があったので試してみたが、
import urllib.parse from urllib.request import urlopen from bs4 import BeautifulSoup import re url = "http://ja.wikipedia.org/wiki/日本語の何か" regex = r'[^\x00-\x7F]' matchedList = re.findall(regex, url) for m in matchedList: url = url.replace(m, urllib.parse.quote_plus(m, encoding = "utf-8"))
でうまくいった。ここでも正規表現である。
[^\x00-\x7F]
これは「[^]」が除外する文字セットの書式で、中にある「\x00-\x7F」がアスキー文字を表しており、つまり「アスキー文字以外」に合致する正規表現となっている。urlに含まれるアスキー文字以外を全て(matchedList)1文字ずつ(m)処理しているわけである。なるほど。 ちなみに、Pythonの文字列(string)はimmutableなので、
url = url.replace(m, urllib.parse.quote_plus(m, encoding = "utf-8"))
こうやってurl自体にurl.replace()でできた新しい文字列を代入している。 urllib.parse.quote_plusは、文字列内の特殊文字をutf-8エンコーディングでエスケープする。
追記
その後、日本語URL対策についてもう少し簡単な方法でやっている先人の知恵をみつけた。こちらの方がシンプルだ。