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