萬九郎の硬い船

プログラミング学習記録など

日本語を含む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対策についてもう少し簡単な方法でやっている先人の知恵をみつけた。こちらの方がシンプルだ。