Python+requestsのurlencode符号化と復号化
2637 ワード
URLコード
URL符号化はブラウザがフォーム入力をパッケージ化するためのフォーマットである.ブラウザはフォームからすべてのnameとその値を取得し、それらをname/valueパラメータで符号化(転送できない文字の削除、データランキングなど)してURLの一部または分離してサーバに送信する
なぜurlencode符号化が必要なのか
理由:同じものが符号化される必要がある場合は、直接伝送に適していないことを示します.Sizeが大きすぎたり、プライバシーデータが含まれたりする理由はさまざまです.Urlにとって符号化を行うのは,Urlの中には曖昧な文字があるからである.
たとえば、URLパラメータ文字列ではkey=valueキー値ペアという形式でパラメータが渡され、キー値ペア間はsなど&記号で区切られます.q=abc&ie=utf-8.value文字列に=または&が含まれている場合、Urlを受信するサーバの解析エラーが発生する可能性があります.したがって、曖昧な&と=記号を変換する必要があります.つまり、それを符号化する必要があります.
ツール推奨:駅長ツールURLオンライン符号化と復号化
運用シーン
Python+requestsをインタフェース自動化する過程でhttpプロトコルはurlを送信する際にurlencodeの符号化フォーマットで渡され、通常requests
ライブラリは自動的に処理してくれます.しかし、特定の場合、符号化と復号化の問題を他の方法で処理する必要がある.
例:
1.サービス側が返すurlアドレスは、urlencodeの符号化で伝達される場合があります.urlからパラメータ情報を抽出する必要があります.この場合、urlを復号する必要があります.
2.ログイン機能ではJavaScriptのコールバック関数(callback)に関し,コールバックを必要とするURL(パラメータ付き)をバックエンドインタフェースに渡す場合,コールバックのurl符号化が必要となる.
Pythonのurllib.parse
urllib.parseの中の3つの方法:urlencode、quoteとunquote、それぞれパラメータの符号化と復号
urlencode符号化
文字列が入力された辞書パラメータをurlencode符号化するには、urlencodeとquoteの2つの方法が必要です.
urlencode
urlencodeメソッドは、次のように辞書を符号化できます.
#!/usr/bin/python3
# coding=utf-8
# Author: sitven
from urllib.parse import urlencode
payload = {
"content": " ",
"charsetSelect": "utf-8",
"en": "UrlEncode "
}
print(urlencode(payload))
実行結果:
content=%E4%B8%AD%E6%96%87%E5%86%85%E5%AE%B9%E4%BF%A1%E6%81%AF&charsetSelect=utf-8&en=UrlEncode%E7%BC%96%E7%A0%81
quote
quoteメソッドは文字列を符号化することができ、以下のようにする.
#!/usr/bin/python3
# coding=utf-8
# Author: sitven
from urllib.parse import quote
print(quote(" "))
url = "http://www.baidu.com/?a= &b=sitven"
print(quote(url))
実行結果:
%E5%BC%A0%E5%A4%A7%E6%AC%BE
http%3A//www.baidu.com/%3Fa%3D%E5%BC%A0%E5%A4%A7%E6%AC%BE%26b%3Dsitven
urlencode復号
返されたデータにurlencode符号化文字列があれば、%E 4%B 5%B 7&b=E 6%82%A 0のようなフォーマットでunquote法で復号できます
unquote
unquoteメソッドの復号化は、次のようになります.
#!/usr/bin/python3
# coding=utf-8
# Author: sitven
from urllib.parse import unquote
import requests
url = "http://httpbin.org/get"
payload = {
"city": " ",
"site": " "
}
r = requests.get(url, params=payload)
print(r.url)
print(unquote(r.url))
実行結果:
http://httpbin.org/get?city=%E5%B9%BF%E5%B7%9E&site=%E5%B0%8F%E8%9B%AE%E8%85%B0
http://httpbin.org/get?city= &site=