使用正则表达式解析url

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re


class URL:
    def __init__(self, url):
        self.url = url.strip()
        match = re.search(r'(?P<protocol>.*?)://(?P<host>[1-9a-zA-z.]*?)(?::(?P<port>\d{1,5}))?/(?P<path>.*?)?(\?(?P<args>(?:[^=&" ]*=[^=&" ]*(?:&|$))*)?)', url)
        if not match:
            raise Exception('not find url')
        self.protocol = match.group('protocol')
        self.host = match.group('host')
        self.path = match.group('path')
        self.args = {}
        for arg in match.group('args').split('&'):
            a = arg.split('=')
            self.args[a[0]] = a[1]


if __name__ == '__main__':
    url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python%20re&oq=python%2520re&rsv_pq=81e580d10006294c&rsv_t=aca82%2FkFyqJi4GCe8V9LnetUu1zQF2xkVlA3JNhdyri%2BBVm9VZPW19tSMto&rqlang=cn&rsv_enter=0'
    u = URL(url)
    print('url: %s' % u.url)
    print('protocol: %s' % u.protocol)
    print('host: %s' % u.host)
    print('path: %s' % u.path)
    print('args: %s' % u.args)

输出:

url: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python%20re&oq=python%2520re&rsv_pq=81e580d10006294c&rsv_t=aca82%2FkFyqJi4GCe8V9LnetUu1zQF2xkVlA3JNhdyri%2BBVm9VZPW19tSMto&rqlang=cn&rsv_enter=0
protocol: https
host: www.baidu.com
path: s
args: {'wd': 'python%20re', 'f': '8', 'rsv_enter': '0', 'rsv_bp': '1', 'rsv_t': 'aca82%2FkFyqJi4GCe8V9LnetUu1zQF2xkVlA3JNhdyri%2BBVm9VZPW19tSMto', 'rsv_idx': '1', 'tn': 'baidu', 'rqlang': 'cn', 'rsv_pq': '81e580d10006294c', 'ie': 'utf-8', 'oq': 'python%2520re'}

 

相关日志

  1. 2018.08.21

    [微信公众号文章抓取.二]构建Anyproxy来获取数据

    上回书说到,啊啊呸。上一篇文章已经确定了抓取…

  2. 2018.09.14

    再用dict.keys()就是狗

    最近刷题用python比较多,毕竟list比…

  3. 2018.06.07

    python爬虫:提取页面时间

    def date_check(date_st…

  4. 2018.08.08

    [微信公众号文章抓取.一]探索各种办法的可行性

    最近在公司做了一个这方面的项目,总结一下。顺…

  5. 2018.03.22

    关于python中yield和协程的一点理解

    yield一般应用于生成循环中的那个变量,一…

  6. 2018.03.20

    python-单向链表

    一个简单的单向链表类 (更多……

评论

还没有评论。

在此评论中不能使用 HTML 标签。