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()関数を利用できるようにする
from __future__ import print_function
を加えることでPython 2.7でPython 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
- 2.x用
urlparse.urlparse
- 3.x用
urllib.parse.urlparse
parse_qs
- 2.x用
urlparse.parse_qs
- 3.x用
urllib.parse.parse_qs