Python requests无法请求Punycode域名?求有效解决方法
简便请求Punycode域名的方法
你遇到的问题是因为带特殊字符的域名需要转换为Punycode(IDNA编码)格式,你使用的urllib3 1.26.13版本无法自动处理这类非ASCII域名,导致requests解析URL失败。
下面是两种简便的解决方法:
方法一:直接转换域名后请求
import requests from encodings.idna import ToASCII # 将含特殊字符的域名转成Punycode puny_domain = ToASCII("💩.la").decode('ascii') # 拼接成可识别的URL并请求 response = requests.get(f"https://{puny_domain}") print(response.status_code)
方法二:拆分URL后编码域名
如果URL包含路径、参数等复杂内容,推荐用这种方式处理整个URL:
import requests from urllib.parse import urlsplit, urlunsplit original_url = "https://💩.la" # 拆分URL各部分 url_parts = urlsplit(original_url) # 对域名进行IDNA编码 puny_domain = url_parts.netloc.encode('idna').decode('ascii') # 重新拼接URL processed_url = urlunsplit((url_parts.scheme, puny_domain, url_parts.path, url_parts.query, url_parts.fragment)) # 发起请求 response = requests.get(processed_url) print(response.status_code)
转换后的💩.la会变成标准Punycode格式的xn--ls8h.la,这是服务器能识别的域名格式,就能正常发起请求了。
内容的提问来源于stack exchange,提问作者Aviv
相关产品推荐
相关产品推荐

