URLコードのピット
3974 ワード
Urlの符号化にはASCII文字しか使用できません.ASCII以外の文字、例えば中国語は使用できません.そうしないと、クライアントまたはサーバ側がサポートする符号化が異なるために問題が発生する可能性があります.
URLが中国語で符号化される方法は、中国語のUTF-8で符号化された文字セット、例えば
あるウェブサイトについて、彼らの中国語に対するURL符号化はウェブページの符号化に従っている.例えば、彼らのウェブページの符号化はGBKまたはGB 2312であり、通常のUTF-8符号化ではない.例えば、このウェブサイトhttps://www.52z.com/の検索では、このとき
URLを符号化する場合は、
ちょっとメモしておきますが、URLコードの知識がないと、こんなサイトに遭遇してどうしたらいいか分からないかもしれません.
URLが中国語で符号化される方法は、中国語のUTF-8で符号化された文字セット、例えば
0xE4 0xB8 0xAD 0xE6 0x96 0x87
を得て、0x
を%
に置き換えるとよい.あるウェブサイトについて、彼らの中国語に対するURL符号化はウェブページの符号化に従っている.例えば、彼らのウェブページの符号化はGBKまたはGB 2312であり、通常のUTF-8符号化ではない.例えば、このウェブサイトhttps://www.52z.com/の検索では、このとき
chardet
ライブラリで応答体の符号化を判断し、要求するパラメータを符号化するときに対応する符号化を用いるだけでよいimport requests
import chardet
class RqCompoent():
@staticmethod
def get(url, *args, **kwargs):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
#
headers = {**headers, **kwargs}
response = requests.get(url, headers=headers)
if response.status_code == 200:
response = response.content
charset = chardet.detect(response).get('encoding')
response = response.decode(charset, "ignore")
return response, charset #
else:
print(" ")
return None
URLを符号化する場合は、
urllib.parse.quote
を使って文字列をURL符号化することができますが、本質的には最下位のstr.decode()
を呼び出しているので、' '.decode(' ')
をそのまま使ってもいいですちょっとメモしておきますが、URLコードの知識がないと、こんなサイトに遭遇してどうしたらいいか分からないかもしれません.