Python解析与提取URL关键字的完整实现方案
本文详细介绍如何利用Python解析URL并提取关键字。通过对比Python2与Python3的urlparse模块差异,结合正则表达式匹配query和path中的关键参数。文章提供了针对百度、搜狗等主流网站及特殊域名如weibo.com的字典映射规则,并附带完整代码与测试案例,帮助开发者高效处理各类URL解析需求。
实现URL解析功能所需的类库如下:
在Python2版本中,引入模块的方式为:
from urlparse import urlparse import urllib
而在Python3版本中,对应的引入方式为:
from urllib.parse import urlparse import urllib.request
经过对不同URL规则的深入分析发现:当搜索关键字通过等号(=)进行拼接时,提取的关键信息位于解析结果中的query部分。
若关键字并非通过等号拼接,则关键信息位于解析结果中的path部分。
无论哪种情况,解析逻辑均一致,使用的正则表达式如下(涵盖6种不同情况的组合):
此外,针对host为’s.weibo.com’的URL,其编码方式与其他域名不同,需要单独进行特殊处理。
具体代码实现如下:部分网站的规则尚不明确,需要投入大量时间进行逆向分析。规则越清晰,关键字提取越准确。以下规则已适用于绝大多数网站,供参考使用。
# -*- coding:utf-8 -*-
from urlparse import urlparse
import urllib
import re
# url
source_txt = "E:\\python_Anaconda_code\\url.txt"
# 规则
regular = r'(\w+(%\w\w)+\w+|(%\w\w)+\w+(%\w\w)+|\w+(%\w\w)+|(%\w\w)+\w+|(%\w\w)+|\w+)'
# 存放关键字
kw_list = list()
# key为要研究网站的host,value为关键字的嫁接标识符
dict = {
"www.baidu.com": "wd=",
"news.baidu.com": "word=",
"www.sogou.com": "query=",
"tieba.baidu.com": "kw=",
"wenku.baidu.com": "word=",
"music.sina.com.cn": "k=",
"www.haosou.com": "q=",
"www.lagou.com": "list_",
"www.chunyuyisheng.com": "query=",
"s.weibo.com": "weibo/"
}
def Main():
with open(source_txt, 'r') as f_source_txt:
for url in f_source_txt:
host = url.split("//")[1].split("/")[0]
if host in dict:
flag = dict[host]
if flag.find("=") != -1:
query = urlparse(url).query.replace('+', '')
kw = re.search(flag + regular, query, re.I) # .group(0)
if kw:
kw = urllib.unquote(kw.group(0).split(flag)[1])
print(kw)
else:
path = urlparse(url).path.replace('+', '')
kw = re.search(flag + regular, path.replace("%25", "%"), re.I)
if kw:
kw = urllib.unquote(kw.group(0).split(flag)[1])
print(kw)
if __name__ == '__main__':
Main()
测试文件url.txt的内容示例如下:
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&ch=&tn=baidu&bar=&wd=python&rn=&oq=&rsv_pq=ece0867c0002c793&rsv_t=edeaQq7DDvZnxq%2FZVra5K%2BEUanlTIUXhGIhvuTaqdfOECLuXR25XKDp%2Bi0I&rqlang=cn&rsv_enter=1&inputT=218 https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&ch=&tn=baidu&bar=&wd=python%E9%87%8C%E7%9A%84%E5%AD%97%E5%85%B8dict&oq=python&rsv_pq=96c160e70003f332&rsv_t=0880NkOvMIr3TvOdDP1t8EbloD8qwr4yeP6CfPjQihQNNhdExfuwyOFMrx0&rqlang=cn&rsv_enter=0&inputT=10411 https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&ch=&tn=baidu&bar=&wd=python%E9%87%8C%E7%9A%84urlprese&oq=python%25E9%2587%258C%25E7%259A%2584re%25E9%2587%258C%25E7%259A%2584%257C%25E6%2580%258E%25E4%25B9%2588%25E7%2594%25A8&rsv_pq=d1d4e7b90003d391&rsv_t=5ff4Vok4EELK1PgJ4oSk8L0VvKAn51%2BL8ns%2FjSubexg7Lb7znKcTvnVtn8M&rqlang=cn&rsv_enter=1&inputT=2797 https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&ch=&tn=baidu&bar=&wd=python++wo+%E7%88%B1urlprese&oq=python%25E9%2587%258C%25E7%259A%2584urlprese&rsv_pq=eecf45e900033e87&rsv_t=1c70xAYhrvw5JOZA7lpVgt4pw%2BW1TO8hqTejTh67JgEQfqAGyDydd25HAmU&rqlang=cn&rsv_enter=0&inputT=10884 http://news.baidu.com/ns?word=%E8%B6%B3%E7%90%83&tn=news&from=news&cl=2&rn=20&ct=1 http://news.baidu.com/ns?ct=1&rn=20&ie=utf-8&bs=%E8%B6%B3%E7%90%83&rsv_bp=1&sr=0&cl=2&f=8&prevct=no&tn=news&word=++++++%E8%B6%B3++%E7%90%83+++++%E4%BD%A0%E5%A5%BD+%E5%98%9B%EF%BC%9F&rsv_sug3=14&rsv_sug4=912&rsv_sug1=4&inputT=8526 http://tieba.baidu.com/f?ie=utf-8&kw=%E7%BA%A2%E6%B5%B7%E8%A1%8C%E5%8A%A8&fr=search&red_tag=q0224393377 https://www.sogou.com/web?query=ni+zai+%E6%88%91+%E5%BF%83li&_asf=www.sogou.com&_ast=1520388441&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=9493&sst0=1520388440692&lkt=8%2C1520388431200%2C1520388436842&sugsuv=1498714959961744&sugtime=1520388440692 https://www.lagou.com/jobs/list_python%E5%A4%A7%E6%95%B0%E6%8D%AEmr?labelWords=&fromSearch=true&suginput= https://www.chunyuyisheng.com/pc/search/?query=%E6%85%A2%E6%80%A7%E4%B9%99%E8%82%9D% http://s.weibo.com/weibo/%25E5%2594%2590%25E4%25BA%25BA%25E8%25A1%2597%25E6%258E%25A2%25E6%25A1%25882&Refer=index http://s.weibo.com/weibo/%25E4%25BD%25A0%25E5%25A5%25BD123mm%2520%25E5%2597%25AF%2520mm11&Refer=STopic_box
运行后的输出结果如下:

如需研究其他host,只需将其添加到字典dict中即可。
备注:以上代码和思路仅供参考,如有更优方案欢迎留言交流!
以上关于Python解析、提取URL关键字的实例详解即为全部内容,希望能对大家有所帮助,也欢迎多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













