使用Python替代方案确定链接的协议

时间:2016-07-23 10:17:06

标签: python regex parsing

我需要找出确定用于访问特定链接的协议的最佳方法。输入:字符串链接地址(以protocol://...开头)

这是我找到实现必要功能的最便捷方式:

def detectProtocol(url):
    ind = url.find("://")
    return url[0:ind] if (ind != -1) else 'default_prot'

然而,我对从性能角度来看最好的方式感兴趣。也许使用re匹配会更好? (但不是那个用户友好的)

提前致谢!

P.S。如果您有自己的替代品,欢迎分享

3 个答案:

答案 0 :(得分:4)

效果比较

这种比较忽略了所用函数的稳定性和协同效应等其他方面。例如,urlparse提供的信息不仅仅是该方案,因此可用于为其他需求提供数据。

Python 2.7.11 +

Testing detect_protocol_by_index
1.56482505798
Testing detect_protocol_by_urlparse
9.13317012787
Testing detect_protocol_by_regex
3.11044311523

Python 3.5.1 +

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添加到脚本的顶部。