【问题标题】:How can I prepend http to a url if it doesn't begin with http?如果它不以 http 开头,我如何将 http 添加到 url?
【发布时间】:2014-03-06 17:05:32
【问题描述】:

我的网址格式为:

google.com
www.google.com
http://google.com
http://www.google.com

我想将所有类型的链接转换为统一格式,以http://开头

http://google.com

如何使用 Python 在 URL 前添加 http://

【问题讨论】:

  • 这太模糊了。你在什么情况下这样做?这些 URL 来自哪里,它们存储在哪里,以及您将它们输出到哪里?
  • @DanielRoseman 我更新了我的问题
  • 这实际上不是一个坏问题,因为 Python 确实有内置函数来正确处理这个问题,例如 urlparse.urlparse(my_url, 'http') 和此模块中的其他函数
  • 您指定了 4 种不同的格式。你确定没有其他格式吗?
  • @JBernardo 除了urlparse(my_url, 'http') 将 URL 识别为路径,而不是 netloc...

标签: python python-2.7 url


【解决方案1】:

Python 确实有内置函数来正确处理它,比如

p = urlparse.urlparse(my_url, 'http')
netloc = p.netloc or p.path
path = p.path if p.netloc else ''
if not netloc.startswith('www.'):
    netloc = 'www.' + netloc

p = urlparse.ParseResult('http', netloc, path, *p[3:])
print(p.geturl())

如果要删除(或添加)www 部分,则必须在调用 .geturl() 之前编辑结果对象的 .netloc 字段。

因为ParseResult 是一个命名元组,你不能就地编辑它,而必须创建一个新对象。

PS:

对于 Python3,应该是urllib.parse.urlparse

【讨论】:

  • @Giri 就是这么做的。因为ParseResult 是一个命名元组,你不能就地编辑它,而必须创建一个新对象
  • 太棒了.. 感谢您的宝贵时间
  • 这一行出现语法错误path = p.path if p.netloc else or ''
  • 您可以使用namedtuple._replace 使其更加简洁。 (以下划线开头,但它是公开的,所以不用担心)。
  • 这是 JBernardo 的示例。如果我们不尝试在前面加上 www. 会更简单,这让我觉得这是一件很奇怪的事情,但我会保留它以供比较:pastebin.com/QwWvVktB。希望有帮助! :)
【解决方案2】:

我发现使用正则表达式检测协议很容易,如果丢失,则添加它:

import re
def formaturl(url):
    if not re.match('(?:http|ftp|https)://', url):
        return 'http://{}'.format(url)
    return url

url = 'test.com'
print(formaturl(url)) # http://test.com

url = 'https://test.com'
print(formaturl(url)) # https://test.com

希望对你有帮助!

【讨论】:

    【解决方案3】:

    对于您在问题中提到的格式,您可以执行以下简单操作:

    def convert(url):
        if url.startswith('http://www.'):
            return 'http://' + url[len('http://www.'):]
        if url.startswith('www.'):
            return 'http://' + url[len('www.'):]
        if not url.startswith('http://'):
            return 'http://' + url
        return url
    

    但请注意,您可能没有预料到其他格式。此外,请记住,输出 URL(根据您的定义)不一定是有效的(即 DNS 无法将其转换为有效的 IP 地址)。

    【讨论】:

    • .find(x) >= 0 写成 .startswith(x) 更为惯用。
    • @larsmans。我最初是使用startsWith 编写的(显然没有用,因为它不是Java)...感谢您的更正;答案修改
    • 这可以适应httphttps 网址吗?
    【解决方案4】:

    如果您的 URL 是字符串类型,您可以直接连接。

    one = "https://"
    two = "www.privateproperty.co.za"
    
    link = "".join((one, two))
    

    【讨论】:

    • 我提交帖子时从来没有出现过。
    【解决方案5】:
    def fix_url(orig_link):
        # force scheme 
        split_comps = urlsplit(orig_link, scheme='https')
        # fix netloc (can happen when there is no scheme)
        if not len(split_comps.netloc):
            if len(split_comps.path):
                # override components with fixed netloc and path
                split_comps = SplitResult(scheme='https',netloc=split_comps.path,path='',query=split_comps.query,fragment=split_comps.fragment)
            else: # no netloc, no path 
                raise ValueError
        return urlunsplit(split_comps)
    

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 1970-01-01
      • 2011-12-16
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多