我需要解析一个URL。目前我正在使用urlparse.urlparse()和urlparse.urlsplit()。
问题是当没有方案(scheme)时,我无法从URL中获取“netloc”(主机)。 我的意思是,如果我有以下URL:
www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1
我就无法获取netloc:www.amazon.com
根据Python文档的说明:
按照RFC 1808中的语法规范, urlparse只识别以“//”正确引入的netloc。 否则,输入被假定为相对URL, 因此以路径组件开头。
所以这是故意这样设计的。但我仍然不知道如何从该URL获取netloc。
我想我可以检查方案是否存在,如果不存在,则添加它,然后解析它。但这个解决方案似乎不是很好。
你有更好的建议吗?
编辑: 感谢所有答案。但是,我不能做Corey和其他人提出的“startswith”事情。因为,如果我得到其他协议/方案的URL,我会搞砸它。看:
如果我得到这个URL:
问题是当没有方案(scheme)时,我无法从URL中获取“netloc”(主机)。 我的意思是,如果我有以下URL:
www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1
我就无法获取netloc:www.amazon.com
根据Python文档的说明:
按照RFC 1808中的语法规范, urlparse只识别以“//”正确引入的netloc。 否则,输入被假定为相对URL, 因此以路径组件开头。
所以这是故意这样设计的。但我仍然不知道如何从该URL获取netloc。
我想我可以检查方案是否存在,如果不存在,则添加它,然后解析它。但这个解决方案似乎不是很好。
你有更好的建议吗?
编辑: 感谢所有答案。但是,我不能做Corey和其他人提出的“startswith”事情。因为,如果我得到其他协议/方案的URL,我会搞砸它。看:
如果我得到这个URL:
ftp://something.com
使用提出的代码,我会在开头添加"http://"并且会搞乱它。
我找到的解决方案
if not urlparse.urlparse(url).scheme:
url = "http://"+url
return urlparse.urlparse(url)
需要注意的是:
我首先执行一些验证,如果没有提供方案(scheme),则将其视为 http://
http://
- 缺失了吗? - ewall//
(可能只有/
),因为一个正确的 URL 会有这个(即使缺少方案)。 - SingleNegationElimination