2010-09-26 93 views
6

我正在写一些东西来'清理'一个URL。在这种情况下,我所要做的就是返回一个伪造的方案,因为urlopen不会在没有人的情况下工作。但是,如果我使用www.python.org进行测试,它将返回http:///www.python.org。有谁知道为什么额外的/,有没有办法在没有它的情况下返回?将url与urlunparse结合起来

def FixScheme(website): 

    from urlparse import urlparse, urlunparse 

    scheme, netloc, path, params, query, fragment = urlparse(website) 

    if scheme == '': 
     return urlunparse(('http', netloc, path, params, query, fragment)) 
    else: 
     return website 

回答

8

问题是,在解析非常不完整的URL www.python.org,你给的字符串实际上是作为该URL的path组成部分,与netloc(网络位置)一个是空的,以及方案。对于默认的方案,您实际上可以传递第二个参数schemeurlparse(简化您的逻辑),但这对“空网络”问题没有帮助。所以你需要一些的逻辑,即的情况,例如,

if not netloc: 
    netloc, path = path, '' 
+0

这是非常有意义的,它假定netloc存在,因为它是一个空字符串,并连接额外/应该在那里。您的解决方案有效!感谢您的快速响应。 – Ben 2010-09-26 15:00:46

+0

@Ben,不客气! – 2010-09-26 15:09:48

+0

@Ben,你应该点击这个答案左边的复选标记以将其标记为接受=) – katrielalex 2010-09-26 15:44:47

0

这是因为在里urlparse解释“www.python.org”不作为主机名(netloc),但作为路径,就像一个浏览器会如果遇到一个href属性,该字符串。然后urlunparse专门解释方案“http”。如果你把“x”作为方案,你会得到“x:www.python.org”。

我不知道你在处理什么范围的输入,但看起来你可能不想要urlparse和urlunparse。