使用简单URL时urlparse解析失败,无法正确识别主机名
为什么urlparse解析"google.com/foo?bar=8"时hostname返回None?
这是个很常见的小坑——urlparse 要求传入的URL必须包含协议头(比如 http:// 或 https://)才能正确识别主机名。
当你只传 "google.com/foo?bar=8" 这种不带协议的字符串时,urlparse 会把整个内容判定为URL的path部分,而不是把google.com识别成主机名,所以hostname自然就返回None了。
看你原来的代码运行结果就能明白:
from urllib.parse import urlparse parsed = urlparse("google.com/foo?bar=8") print(parsed.hostname) # 输出: None print(parsed.path) # 输出: google.com/foo (整个内容被当成路径了)
解决办法
给URL补上协议头就可以正常解析了:
from urllib.parse import urlparse parsed = urlparse("http://google.com/foo?bar=8") print(parsed.hostname) # 输出: google.com
如果你的场景里经常会遇到不带协议的URL,也可以封装一个小函数自动补全:
from urllib.parse import urlparse def safe_parse_url(url): # 如果没有检测到协议头,自动添加http:// parsed = urlparse(url) if not parsed.scheme: url = f"http://{url}" parsed = urlparse(url) return parsed # 测试不带协议的URL result = safe_parse_url("google.com/foo?bar=8") print(result.hostname) # 输出: google.com # 测试带协议的URL也能正常工作 result = safe_parse_url("https://stackoverflow.com/questions") print(result.hostname) # 输出: stackoverflow.com
内容的提问来源于stack exchange,提问作者user1618465
相关产品推荐
相关产品推荐

