PythonでURLをパースする

Python2.7と3.5で動作するサンプルコードです。

Python2 と Python3 で動作するサンプルコード

  • URLのパースにurlparseを利用します。
  • params, queryのパースにはparse_qsを利用します。
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys

# print(sys.version_info)
## 2.7: sys.version_info(major=2, minor=7, micro=11, releaselevel='final', serial=0)
## 3.5: sys.version_info(major=3, minor=5, micro=1, releaselevel='final', serial=0)

if sys.version_info.major <= 2:
    # Python 2.7
    from urlparse import urlparse, parse_qs
else:
    # Python 3.5
    from urllib.parse import urlparse, parse_qs

parse = urlparse('https://www.example.com/file;p1=1;p1=2?encoding=UTF-8&q1=1&q1=2&q1=3&q2=#q=example')
print(parse)
# 2.7: ParseResult(scheme='https', netloc='www.example.com', path='/file', params='p1=1;p1=2', query='encoding=UTF-8&q1=1&q1=2&q1=3&q2=', fragment='q=example')
# 3.5: ParseResult(scheme='https', netloc='www.example.com', path='/file', params='p1=1;p1=2', query='encoding=UTF-8&q1=1&q1=2&q1=3&q2=', fragment='q=example')

p = parse_qs(parse.params)
print(p)
# 2.7: {'p1': ['1', '2']}
# 3.5: {'p1': ['1', '2']}

# 値がカラのパラメータは無視される
q = parse_qs(parse.query)
print(q)
# 2.7: {'q1': ['1', '2', '3'], 'encoding': ['UTF-8']}
# 3.5: {'q1': ['1', '2', '3'], 'encoding': ['UTF-8']}

# parse_qs()の第2引数をTrueとすることで値がカラのパラメータも結果に含まれる
q2 = parse_qs(parse.query, True) 
print(q2)
# 2.7: {'q1': ['1', '2', '3'], 'q2': [''], 'encoding': ['UTF-8']}
# 3.5: {'q2': [''], 'q1': ['1', '2', '3'], 'encoding': ['UTF-8']}

for key in sorted(q.keys()):
    # 区切り文字`sep`の初期値は' '(半角スペース)
    # 文末`end`の初期値は'\n'
    print(key, '=', q[key], sep='\t', end=', ') 
    # encoding  =   ['UTF-8'], q1   =   ['1', '2', '3'], 

print()

if 'q1' in q: # Python3 に dict.has_key() は無い
    for v in q['q1']:
        print(v, end=', ')
        # 1, 2, 3, 

import文、from文の注意点

  • import文はimport モジュール
  • from文はfrom モジュール import 関数

Python 2.6以降で3のprint()関数を利用できるようにする

Python 2と3で読み込むモジュールを変える

  • urlparse, parse_qs の含まれるモジュールがPython 2と3で異なるので、バージョンによって読み込むモジュールを変えています。
import sys
if sys.version_info.major <= 2:
    # Python 2.7
    from urlparse import urlparse, parse_qs
else:
    # Python 3.5
    from urllib.parse import urlparse, parse_qs

dict.has_key() は廃れた用法

  • Python 3でdict.has_key()を使用するとAttributeErrorが発生します。
AttributeError: 'dict' object has no attribute 'has_key'
  • dictにkeyがあるかどうかはkey in dictでチェックします。
if key in dict:
    pass

d = {'a':12}
print('ok' if 'a' in d else 'ng')
# ok
  • 反対にdictにkeyがない場合のチェックはkey not in dictで行えます。
if key not in dict:
    pass

d = {'a':12}
print('ok' if 'a' not in d else 'ng')
# ng

各関数のドキュメント

urlparse

parse_qs