如何在Python中从url中删除方案?

如何在Python中从url中删除方案?,python,url-rewriting,Python,Url Rewriting,我正在使用一个返回URL的应用程序,它是用Flask编写的。我希望向用户显示的URL尽可能干净,因此我希望从中删除http://。我查找并找到了urlparse库,但找不到任何关于如何执行此操作的示例 最好的方法是什么?如果urlparse过于苛刻,有没有更简单的方法?仅仅使用常规的字符串解析工具从URL中删除“http://”子字符串是错误的做法还是会导致问题 我不认为urlparse提供了单一的方法或函数。我会这样做: from urlparse import urlparse url =

我正在使用一个返回URL的应用程序,它是用
Flask
编写的。我希望向用户显示的
URL
尽可能干净,因此我希望从中删除
http://
。我查找并找到了
urlparse
库,但找不到任何关于如何执行此操作的示例


最好的方法是什么?如果
urlparse
过于苛刻,有没有更简单的方法?仅仅使用常规的字符串解析工具从URL中删除“
http://
”子字符串是错误的做法还是会导致问题

我不认为
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)
输出:

stackoverflow.com/questions/tagged/python?page=2

如果使用(仅)简单的字符串解析,则必须自己处理
http[s]
,还可能处理其他方案。此外,这还处理了奇怪的方案大小写。

如果您是以编程方式使用这些方案,而不是使用替换方案,我建议让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()
只需将输入替换为空字符串,即可删除parsedresult的任何组件

需要注意的是,这个答案与@Lukas Graf的答案在功能上存在差异。最有可能的功能差异是,url的“/”组件在技术上不是方案,因此这个答案将保留它,而它将保留在这里

>>> Lukas_strip_scheme('https://yoman/hi?whatup')
'yoman/hi?whatup'
>>> strip_scheme('https://yoman/hi?whatup')
'//yoman/hi?whatup'

我在Flask库和扩展中看到了这一点。值得注意的是,您可以执行此操作,尽管它确实使用了ParseResult/SplitResult的受保护成员(.\u replace)

url = 'HtTp://stackoverflow.com/questions/tagged/python?page=2'
split_url = urlsplit(url) 
# >>> SplitResult(scheme='http', netloc='stackoverflow.com', path='/questions/tagged/python', query='page=2', fragment='')
split_url_without_scheme = split_url._replace(scheme="")
# >>> SplitResult(scheme='', netloc='stackoverflow.com', path='/questions/tagged/python', query='page=2', fragment='')
new_url = urlunsplit(split_url_without_scheme)

一个简单的正则表达式搜索和替换工作

import re
def strip_scheme(url: str):
    return re.sub(r'^https?:\/\/', '', url)

\u replace
方法不受保护。它是API的公共部分。它只有下划线以防止名称冲突。这里列出的三个方法和两个属性都是公共的:。命名元组不允许字段名以
\uuu
开头,因此标准库可以使用下划线作为伪名称空间。这不起作用,因为生成的url以
/
@开头的通知为true。我们也必须把它去掉,但我们最终得到的答案更接近于卢卡斯·格拉夫的答案,更优雅