萬九郎の硬い船

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

urlparseでURLを分解する/組み立てる

urllib.parseのurlparseを使うと、受け取ったURLを解析して分解したり、組み立て直すことができる。 urllibについては、本の冒頭で「繰り返し出てくるからドキュメントを読んでおけ」とあったとおり、細かい部分は一切説明がないので、メモしておく。

scheme://netloc/path;parameters?query#fragment

このURLの構造にもとづいて、受け取ったURLがscheme、netloc、path、parameters、query、fragmentの6つの要素からなるタプルになり、

from urllib.parse import urlparse

url = "http://mankuro.xyz/blog/2017/05/11/relax/#respond"
parsedUrl = urlparse(url)

こうした場合、

parsedUrl.scheme
parsedUrl.netloc
parsedUrl.path
parsedUrl.parameters
parsedUrl.query
parsedUrl.fragment

でそれぞれ取り出すことができる。なるほど。 が、しかし、ちょっと待てよ?僕が知っているタプルの特徴は、「シーケンス型」なので値にアクセスするにはインデックスを使う、というものだ。

for i in range(len(parsedUrl)):
    print(parsedUrl[i])

みたいにやらないといけないのではなかったのか?

戻り値は実際にはtupleのサブクラスのインスタンスです。

この辺に秘密がありそうな気がするが、どうやらPythonで「.(ドット)」でつなぐ場合にどのようなものがあるか、というのをもう少しちゃんと理解する必要がありそうだ。 ともかく、urlparseの使い方自体は理解した。たとえば、受け取ったURLの階層が深かったりした場合に、一回分解してからparsedUrl.schemeとparsedUrl.netlocを合体したものと正規表現などを組み合わせることで、トップレベルからアクセスし直したりできる、ということだ。