san*_*lto 19 python url url-parsing urlparse
我需要解析一个URL.我目前正在使用urlparse.urlparse()和urlparse.urlsplit().
问题是,当不存在该方案时,我无法从URL获取"netloc"(主机).我的意思是,如果我有以下网址:
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和其他人提出的"startwith"事情.如果我得到一个其他协议/方案的URL我会搞砸了.看到:
如果我得到这个网址:
ftp://something.com
使用提议的代码,我会在开头添加"http://"并将其弄乱.
我发现的解决方案
if not urlparse.urlparse(url).scheme:
   url = "http://"+url
return urlparse.urlparse(url)
需要注意的事项:
我先做一些验证,如果没有给出方案,我认为它是http://
Cor*_*erg 11
看起来你需要指定协议来获取netloc.
如果它不存在则添加它可能如下所示:
import urlparse
url = 'www.amazon.com/Programming-Python-Mark-Lutz'
if '//' not in url:
    url = '%s%s' % ('http://', url)
p = urlparse.urlparse(url)
print p.netloc
文档有这个确切的示例,就在您粘贴的文本下方.添加'//'如果它不存在将得到你想要的.如果您不知道它是否具有协议和'//',您可以使用正则表达式(或者甚至只是看它是否已包含'//')来确定是否需要添加它.
你的另一个选择是使用split('/')并获取它返回的列表的第一个元素,这仅在url没有协议或'//'时才有效.
编辑(为将来的读者添加):用于检测协议的正则表达式就像 re.match('(?:http|ftp|https)://', url)
如果协议总是 http你只能使用一行:
return "http://" + url.split("://")[-1]
更好的选择是使用协议,如果它通过:
return url if "://" in url else "http://" + url
从文档:
遵循 RFC 1808 中的语法规范,urlparse 仅在由“//”正确引入时才识别 netloc。否则,输入被假定为相对 URL,因此以路径组件开头。
所以你可以这样做:
In [1]: from urlparse import urlparse
In [2]: def get_netloc(u):
   ...:     if not u.startswith('http'):
   ...:         u = '//' + u
   ...:     return urlparse(u).netloc
   ...: 
In [3]: get_netloc('www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1')
Out[3]: 'www.amazon.com'
In [4]: get_netloc('http://www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1')
Out[4]: 'www.amazon.com'
In [5]: get_netloc('https://www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1')
Out[5]: 'www.amazon.com'
| 归档时间: | 
 | 
| 查看次数: | 12716 次 | 
| 最近记录: |