如何从Python中删除url中的scheme?

Luc*_* N. 5 python url-rewriting

我正在使用一个返回urls的应用程序,用Flask.我希望URL显示给用户尽可能干净,所以我想从中删除http://它.我查看并找到了urlparse库,但找不到任何如何执行此操作的示例.

什么是最好的方法,如果urlparse是矫枉过正是有一个更简单的方法?http://只是使用常规字符串解析工具从URL中删除" "子串是不好的做法还是会导致问题?

Luk*_*raf 7

我不认为urlparse为此提供单一的方法或功能.我就是这样做的:

from urlparse import urlparse

url = 'HtTp://stackoverflow.com/questions/tagged/python?page=2'

def strip_scheme(url):
    parsed = urlparse(url)
    scheme = "%s://" % parsed.scheme
    return parsed.geturl().replace(scheme, '', 1)

print strip_scheme(url)
Run Code Online (Sandbox Code Playgroud)

输出:

stackoverflow.com/questions/tagged/python?page=2
Run Code Online (Sandbox Code Playgroud)

如果您使用(仅)简单的字符串解析,您必须自己处理http[s],可能还有其他方案.此外,这处理该方案的奇怪外壳.

  • 对于 Python 3,导入来自 urllib.parse import urlparse (2认同)

Bri*_*ian 6

如果您以编程方式使用这些而不是使用替换,我建议让 urlparse 在没有方案的情况下重新创建 url。

ParseResult 对象是一个元组。所以你可以创建另一个删除你不想要的字段。

# py2/3 compatibility
try:
    from urllib.parse import urlparse, ParseResult
except ImportError:
    from urlparse import urlparse, ParseResult


def strip_scheme(url):
    parsed_result = urlparse(url)
    return ParseResult('', *parsed_result[1:]).geturl()
Run Code Online (Sandbox Code Playgroud)

您可以通过简单地用空字符串替换输入来删除解析结果的任何组件。

重要的是要注意此答案与@Lukas Graf 的答案之间存在功能差异。最可能的功能差异是 url 的 '//' 组件在技术上不是方案,所以这个答案将保留它,而它将保留在这里。

>>> Lukas_strip_scheme('https://yoman/hi?whatup')
'yoman/hi?whatup'
>>> strip_scheme('https://yoman/hi?whatup')
'//yoman/hi?whatup'
Run Code Online (Sandbox Code Playgroud)