当前位置: 主页 > 日志 > Webscraping >

URL规范化Python实现

指向同一资源的URL表现形式可能存在差异,例如,下面三个URL实际上指向的是同一资源:

http://www.REDICECN.com/

http://www.redicecn.com

http://www.redicecn.com/tools/../

对于爬虫来说,合理的处理方式是将上述三个表现不同URL视为相同的URL。

 

下面给出一个Python的解决方案,没有考虑URL编码的问题:

# url_normal.py
# by redice
import re
import urlparse

def url_normal(url):
    """normalize url
    """
    scheme, netloc, upath, qus = urlparse.urlsplit(url)[:4]
    netloc = netloc.lower()
    
    if upath:
        upath = re.sub('/{2,}', '/', upath)
        upath = re.sub(r'/\./', '/', upath)
        
        parent_regex = re.compile(r'/[^/]+/\.\.')
        while parent_regex.search(upath):
            upath = parent_regex.sub('/', upath)
            
        upath = re.sub('/{2,}', '/', upath)
        if upath.startswith('/..') or upath.endswith('/.'):
            upath = ''
        else:
            upath = re.sub('/$', '', upath)

    if qus:
        return '%s://%s%s?%s' % (scheme, netloc, upath or '/', qus)
    else:
        return '%s://%s%s' % (scheme, netloc, upath)


if __name__ == '__main__':
    print url_normal('http://www.REDICECN.com/?id=1')
    print url_normal('http://www.redicecn.com:80/.')
    print url_normal('http://www.redicecn.com//tools/////../index.php?upcache=1')

[日志信息]

该日志于 2011-05-12 00:32 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “URL规范化Python实现” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部