PythonのURLとクエリパラメータのパースまとめ

## tl;dr

ここでは、PythonでのURLやクエリパラメータの解析、パーセントエンコーディングの変換方法をまとめています。

なお、Python3ではURLの取得や解析等のモジュールが`urllib`に統一されています。以下に簡単に対応表をまとめました。

|   |Python2 |Python3|
|---|---|---|
| URLパース  | urlparse.urlparse  | urllib.parse.urlparse  |
| クエリ文字列解析  | urlparse.parse_qs  | urllib.parse.parse_qs  |
| クエリパラメータ作成  | urllib.urlencode  | urllib.parse.urlencode  |
| エスケープ  | urllib.quote  | urllib.parse.quote  |
| エスケープ復元  | urllib.unquote  | urllib.parse.unquote  |


## Python3

以下のコードは`urllib`のインポートを前提としています。

```
import urllib
```

### URLのパース

```python
urllib.parse.urlparse("http://example.com/example.html?foo=bar&hoge=fuga")
# => ParseResult(scheme='http', netloc='example.com', path='/example.html', params='', query='foo=bar&hoge=fuga', fragment='') 
```

- [http://docs.python.jp/3/library/urllib.parse.html#urllib.parse.urlparse](http://docs.python.jp/3/library/urllib.parse.html#urllib.parse.urlparse)

### クエリパラメータのパース

```python
urllib.parse.parse_qs("foo=bar&hoge=fuga")
# => {'hoge': ['fuga'], 'foo': ['bar']}                                                                                           
```

```python
urllib.parse.parse_qs("query=%E3%83%86%E3%82%B9%E3%83%88")
# => {'query': ['テスト']}
```

- [http://docs.python.jp/3/library/urllib.parse.html#urllib.parse.parse_qs](http://docs.python.jp/3/library/urllib.parse.html#urllib.parse.parse_qs)

### 辞書からクエリパラメータ作成

```python
urllib.parse.urlencode({"query":"テスト"})
# => query=%E3%83%86%E3%82%B9%E3%83%88
```

- [http://docs.python.jp/3/library/urllib.parse.html#urllib.parse.urlencode](http://docs.python.jp/3/library/urllib.parse.html#urllib.parse.urlencode)

### パーセントエンコーディング文字列の変換

```python
urllib.parse.quote("テスト")
# => %E3%83%86%E3%82%B9%E3%83%88

urllib.parse.unquote("%E3%83%86%E3%82%B9%E3%83%88")
# => テスト
```

- [http://docs.python.jp/3/library/urllib.parse.html#url-quoting](http://docs.python.jp/3/library/urllib.parse.html#url-quoting)


## Python2

以下のコードは`urllib`および`urlparse`のインポートを前提としています。

```
import urllib
import urlparse
```

### URLのパース

```python
urlparse.urlparse("http://example.com/example.html?foo=bar&hoge=fuga")
# => ParseResult(scheme='http', netloc='example.com', path='/example.html', params='', query='foo=bar&hoge=fuga', fragment='') 
```

- [http://docs.python.jp/2/library/urlparse.html#urlparse.urlparse](http://docs.python.jp/2/library/urlparse.html#urlparse.urlparse)

### クエリパラメータのパース

```python
urlparse.parse_qs("foo=bar&hoge=fuga")
# => {'hoge': ['fuga'], 'foo': ['bar']}                                                                                           
```

```python
urlparse.parse_qs("query=%E3%83%86%E3%82%B9%E3%83%88")
# => {'query': ['テスト']}
```

[http://docs.python.jp/2/library/urlparse.html#urlparse.parse_qs](http://docs.python.jp/2/library/urlparse.html#urlparse.parse_qs)

### 辞書からクエリパラメータ作成

```python
urllib.urlencode({"query":"テスト"})
# => query=%E3%83%86%E3%82%B9%E3%83%88
```

- [http://docs.python.jp/2/library/urllib.html#urllib.urlencode](http://docs.python.jp/2/library/urllib.html#urllib.urlencode) 

### パーセントエンコーディング文字列の変換

```python
urllib.quote("テスト")
# => %E3%83%86%E3%82%B9%E3%83%88

urllib.unquote("%E3%83%86%E3%82%B9%E3%83%88")
# => テスト
```

- [http://docs.python.jp/2/library/urllib.html#utility-functions](http://docs.python.jp/2/library/urllib.html#utility-functions)


## 参考

- Python2
	- [20.5. urllib — URL による任意のリソースへのアクセス — Python 2.7.x ドキュメント](http://docs.python.jp/2/library/urllib.html)
	- [20.16. urlparse — URL を解析して構成要素にする — Python 2.7.x ドキュメント](http://docs.python.jp/2/library/urlparse.html)
- Python3
	- [21.8. urllib.parse — URL を解析して構成要素にする — Python 3.5.2 ドキュメント](http://docs.python.jp/3/library/urllib.parse.html)
- [2to3を使ってコードをPython 3に移植する - Dive Into Python 3 日本語版](http://diveintopython3-ja.rdy.jp/porting-code-to-python-3-with-2to3.html#urllib)