views:

33

answers:

2

Hi I'm new to Python so forgive me if this seems a little obvious but I can't see that it's been asked before.

I'm writing something to 'clean' a URL. In this case all I'm trying to do is return a faked scheme as urlopen won't work without one. However, if I test this with 'www.python.org' It'll return http:///www.python.org. Does anyone know why the extra /, and is there a way to return this without it?

Thank you very much.

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
+1  A: 

Problem is that in parsing the very incomplete URL www.python.org, the string you give is actually taken as the path component of the URL, with the netloc (network location) one being empty as well as the scheme. For defaulting the scheme you can actually pass a second parameter scheme to urlparse (simplifying your logic) but that does't help with the "empty netloc" problem. So you need some logic for that case, e.g.

if not netloc:
    netloc, path = path, ''
Alex Martelli
That makes perfect sense, it's assuming that the netloc exists as it's an empty string and concatenating the extra / that should be there. Your solution works!Thanks for the quick response.
Ben
@Ben, you're welcome!
Alex Martelli
@Ben, you should click the checkmark to the left of this answer to mark it as accepted =)
katrielalex
A: 

It's because urlparse is interpreting "www.python.org" not as the hostname (netloc), but as the path, just as a browser would if it encountered that string in an href attribute. Then urlunparse seems to interpret scheme "http" specially. If you put in "x" as the scheme, you'll get "x:www.python.org".

I don't know what range of inputs you're dealing with, but it looks like you might not want urlparse and urlunparse.

Ned Batchelder