我需要找出确定用于访问特定链接的协议的最佳方法。输入:字符串链接地址(以protocol://...
开头)
这是我找到实现必要功能的最便捷方式:
def detectProtocol(url):
ind = url.find("://")
return url[0:ind] if (ind != -1) else 'default_prot'
然而,我对从性能角度来看最好的方式感兴趣。也许使用re
匹配会更好? (但不是那个用户友好的)
提前致谢!
P.S。如果您有自己的替代品,欢迎分享
答案 0 :(得分:4)
这种比较忽略了所用函数的稳定性和协同效应等其他方面。例如,urlparse
提供的信息不仅仅是该方案,因此可用于为其他需求提供数据。
Testing detect_protocol_by_index
1.56482505798
Testing detect_protocol_by_urlparse
9.13317012787
Testing detect_protocol_by_regex
3.11044311523
Testing detect_protocol_by_index
1.5673476169999958
Testing detect_protocol_by_urlparse
15.466406801000176
Testing detect_protocol_by_regex
3.0660895540004276
import sys
import timeit
import re
if sys.version_info >= (3, 0):
from urllib.parse import urlparse
else:
from urlparse import urlparse
def detect_protocol_by_index(url):
ind = url.find("://")
return url[0:ind] if (ind != -1) else 'default_prot'
def detect_protocol_by_urlparse(url):
scheme = urlparse(url).scheme
return scheme if scheme else 'default_prot'
regex = re.compile('^[^:]+(?=:\/\/)')
def detect_protocol_by_regex(url):
match = regex.match(url)
return match.group(0) if match else 'default_prot'
### TEST SETUP ###
test_urls = ['www.example.com', 'http://example.com', 'https://example.com', 'ftp://example.com']
def run_test(func):
for url in test_urls:
func(url)
def run_tests():
funcs = [detect_protocol_by_index, detect_protocol_by_urlparse, detect_protocol_by_regex]
for func in funcs:
print("Testing {}".format(func.__name__))
print(timeit.timeit('run_test({})'.format(func.__name__), setup="from __main__ import run_test, {}".format(func.__name__)))
if __name__ == '__main__':
run_tests()
答案 1 :(得分:1)
你可以使用正则表达式(r'^[a-zA-Z]+://'
),并在检查它是否有效之前编译它。
但是你有一个内置函数:
import urlparse
url = urlparse.urlparse('https://www.wwww.com')
print url.scheme
输出:
>>> https
答案 2 :(得分:1)
如果您正在寻找跨python版本的解决方案:
try:
import urlparse
except ImportError:
import urllib.parse as urlparse
url = urlparse.urlparse('https://www.example.com')
print(url.scheme)
如果您希望打印是相同的,可以将from __future__ import print_function
添加到脚本的顶部。