[240]python的urllib.parse库解析URL

article/2025/9/30 13:29:46

image.png

Python 中的 urllib.parse 模块提供了很多解析和组建 URL 的函数。

解析url

urlparse() 函数可以将 URL 解析成 ParseResult 对象。对象中包含了六个元素,分别为:

协议(scheme)
域名(netloc)
路径(path)
路径参数(params)
查询参数(query)
片段(fragment)

from urllib.parse import urlparseurl='http://user:pwd@domain:80/path;params?query=queryarg#fragment'parsed_result=urlparse(url)print('parsed_result 包含了',len(parsed_result),'个元素')
print(parsed_result)

结果为:

parsed_result 包含了 6 个元素
ParseResult(scheme='http', netloc='user:pwd@domain:80', path='/path', params='params', query='query=queryarg', fragment='fragment')

ParseResult 继承于 namedtuple ,因此可以同时通过索引和命名属性来获取 URL 中各部分的值。

为了方便起见, ParseResult 还提供了 username 、 password 、 hostname 、 port 对 netloc 进一步进行拆分。

print('scheme  :', parsed_result.scheme)
print('netloc  :', parsed_result.netloc)
print('path    :', parsed_result.path)
print('params  :', parsed_result.params)
print('query   :', parsed_result.query)
print('fragment:', parsed_result.fragment)
print('username:', parsed_result.username)
print('password:', parsed_result.password)
print('hostname:', parsed_result.hostname)
print('port    :', parsed_result.port)

结果为:

scheme  : http
netloc  : user:pwd@domain:80
path    : /path
params  : params
query   : query=queryarg
fragment: fragment
username: user
password: pwd
hostname: domain
port    : 80

除了 urlparse() 之外,还有一个类似的 urlsplit() 函数也能对 URL 进行拆分,所不同的是, urlsplit() 并不会把 路径参数(params) 从 路径(path) 中分离出来。

当 URL 中路径部分包含多个参数时,使用 urlparse() 解析是有问题的:

url='http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment'parsed_result=urlparse(url)print(parsed_result)
print('parsed.path    :', parsed_result.path)
print('parsed.params  :', parsed_result.params)

结果为:

ParseResult(scheme='http', netloc='user:pwd@domain:80', path='/path1;params1/path2', params='params2', query='query=queryarg', fragment='fragment')
parsed.path    : /path1;params1/path2
parsed.params  : params2

这时可以使用 urlsplit() 来解析:

from urllib.parse import urlsplit
split_result=urlsplit(url)print(split_result)
print('split.path    :', split_result.path)
# SplitResult 没有 params 属性

结果为:

SplitResult(scheme='http', netloc='user:pwd@domain:80', path='/path1;params1/path2;params2', query='query=queryarg', fragment='fragment')
split.path    : /path1;params1/path2;params2

若只是要将 URL 后的 fragment 标识拆分出来,可以使用 urldefrag() 函数:

from urllib.parse import urldefragurl = 'http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment'd = urldefrag(url)
print(d)
print('url     :', d.url)
print('fragment:', d.fragment)

结果为:

DefragResult(url='http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg', fragment='fragment')
url     : http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg
fragment: fragment

组建URL

ParsedResult 对象和 SplitResult 对象都有一个 geturl() 方法,可以返回一个完整的 URL 字符串。

print(parsed_result.geturl())
print(split_result.geturl())

结果为:

http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment
http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment

但是 geturl() 只在 ParsedResult 和 SplitResult 对象中有,若想将一个普通的元组组成 URL,则需要使用 urlunparse() 函数:

from urllib.parse import urlunparse
url_compos = ('http', 'user:pwd@domain:80', '/path1;params1/path2', 'params2', 'query=queryarg', 'fragment')
print(urlunparse(url_compos))

结果为:

http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment

相对路径转换绝对路径

除此之外, urllib.parse 还提供了一个 urljoin() 函数,来将相对路径转换成绝对路径的 URL。

from urllib.parse import urljoinprint(urljoin('http://www.example.com/path/file.html', 'anotherfile.html'))
print(urljoin('http://www.example.com/path/', 'anotherfile.html'))
print(urljoin('http://www.example.com/path/file.html', '../anotherfile.html'))
print(urljoin('http://www.example.com/path/file.html', '/anotherfile.html'))

结果为:

http://www.example.com/path/anotherfile.html
http://www.example.com/path/anotherfile.html
http://www.example.com/anotherfile.html
http://www.example.com/anotherfile.html

查询参数的构造和解析

使用 urlencode() 函数可以将一个 dict 转换成合法的查询参数:

from urllib.parse import urlencodequery_args = {'name': 'dark sun','country': '中国'
}query_args = urlencode(query_args)
print(query_args)

结果为:

name=dark+sun&country=%E4%B8%AD%E5%9B%BD

可以看到特殊字符也被正确地转义了。

相对的,可以使用 parse_qs() 来将查询参数解析成 dict。

from urllib.parse import parse_qs
print(parse_qs(query_args))

结果为:

{'name': ['dark sun'], 'country': ['中国']}

如果只是希望对特殊字符进行转义,那么可以使用 quote 或 quote_plus 函数,其中 quote_plus 比 quote 更激进一些,会把 : 、 / 一类的符号也给转义了。

from urllib.parse import quote, quote_plus, urlencodeurl = 'http://localhost:1080/~hello!/'
print('urlencode :', urlencode({'url': url}))
print('quote     :', quote(url))
print('quote_plus:', quote_plus(url))

结果为:

urlencode : url=http%3A%2F%2Flocalhost%3A1080%2F%7Ehello%21%2F
quote     : http%3A//localhost%3A1080/%7Ehello%21/
quote_plus: http%3A%2F%2Flocalhost%3A1080%2F%7Ehello%21%2F

可以看到 urlencode 中应该是调用 quote_plus 来进行转义的。

逆向操作则使用 unquote 或 unquote_plus 函数:

from urllib.parse import unquote, unquote_plusencoded_url = 'http%3A%2F%2Flocalhost%3A1080%2F%7Ehello%21%2F'
print(unquote(encoded_url))
print(unquote_plus(encoded_url))

结果为:

http://localhost:1080/~hello!/
http://localhost:1080/~hello!/

你会发现 unquote 函数居然能正确地将 quote_plus 的结果转换回来。


1、获取url参数

>>>from urllib import parse>>> url =r'[https://docs.python.org/3.5/search.html?q=parse&check_keywords=yes&area=default](https://docs.python.org/3.5/search.html?q=parse&check_keywords=yes&area=default)'>>> parseResult=parse.urlparse(url)>>> parseResultParseResult(scheme='https', netloc='docs.python.org', path='/3.5/search.html', params='', query='q=parse&check_keywords=yes&area=default', fragment=' ')>>> param_dict=parse.parse_qs(parseResult.query)>>> param_dict{'q': ['parse'],'check_keywords': ['yes'],'area': ['default']}>>> q=param_dict['q'][0]>>> q'parse'#注意:加号会被解码,可能有时并不是我们想要的>>> parse.parse_qs('proxy=183.222.102.178:8080&task=XXXXX|5-3+2'){'proxy': ['183.222.102.178:8080'],'task': ['XXXXX|5-3 2']}

2、urlencode

>>> from urllib import parse
>>> query = {'name': 'walker','age': 99,}
>>> parse.urlencode(query)
'name=walker&age=99'

3、quote/quote_plus

>>> from urllib import parse
>>> parse.quote('a&b/c')  #未编码斜线
'a%26b/c'
>>> parse.quote_plus('a&b/c')  #编码了斜线
'a%26b%2Fc'

4、unquote/unquote_plus

from urllib import parse
>>> parse.unquote('1+2')  #不解码加号
'1+2'
>>> parse.unquote_plus('1+2')  #把加号解码为空格
'1 2'

参考:http://ju.outofmemory.cn/entry/344949
http://www.jb51.net/article/92818.htm


http://chatgpt.dhexx.cn/article/Flu95O5d.shtml

相关文章

Python之urllib爬虫-request模块和parse模块详解

文章目录 urllibrequest模块访问URLRequest类其他类 parse模块解析URL转义URL robots.txt文件 urllib urllib是Python中用来处理URL的工具包,源码位于/Lib/下。它包含了几个模块:用于打开及读写的urls的request模块、由request模块引起异常的error模块、…

url.parse() 的替换方法new URL(),URl.parse()的使用。

URl.parse()的解析使用 对于这种表单提交的的请求路径,由于其中具有用户动态填写的内容所以不能通过完整的URL路径来处理这个请求对于我们来讲,只需要判定,请求路径是/……?之前就行 var myurl require(url); var obj myurl.p…

Python之urlparse模块

一、简介 urlparse库用于把url解析为各个组件,支持file,ftp,http,https, imap, mailto, mms, news, nntp, prospero, rsync, rtsp, rtspu, sftp, shttp, sip, sips, snews, svn, svnssh, telnet等几乎所有的形式。根据其官网的说明,在Python3.0中&#x…

Python模块:urlparse模块(操作url)

文章目录 一、介绍二、功能介绍1.urlparse.urlparse2.urlparse.urlsplit3.urlparse.urljoin 一、介绍 官方文档 :http://docs.python.org/library/urlparse.html作用:urlparse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接注意&…

基于FPGA的人脸识别

基于FPGA的人脸识别 一.理论基础 1.基本介绍 模块框图: 在上一篇文章里,已经实现了基于OV5640的摄像头监控,在此基础上,我们加入一些图像处理的内容,即可实现简单的一些图像处理效果,这次做到的就是最…

facenet 人脸识别原理理解(三)

在前两篇文章已经介绍了facenet人脸识别代码的使用和具体操作,但相关的原理还是没有说,这篇文章进行简单的讲解一下。 1. 原理 在人脸识别中,当我们需要加在图片数据库入新的一张人脸图片时,是怎么做到识别的呢,难道…

人脸识别mtcnn原理

人脸检测,也就是在图片中找到人脸的位置。输入是一张可能含有人脸的图片,输出是人脸位置的矩形框。 人脸对齐。原始图片中人脸的姿态、位置可能有较大的区别,为了之后统一处理,要把人脸“摆正”。为此,需要检测人脸中…

dlib中的人脸识别原理

这里讨论的是人脸识别,不是人脸检测 dlib中是先检测都人脸,然后把人脸通过Resnet生成一个128维的向量,Resnet有几种不同深度的结构(图片来自https://raw.githubusercontent.com/raghakot/keras-resnet/master/images/architecture.png) dlib…

计算机识别人脸原理,深入浅出人脸识别原理

编辑推荐: 本文主要介绍了人脸识别流程,如何提取面部训练数据进行识别以及人脸检测和人脸识别,它们应用场景有哪些,希望对您的学习又所帮助。 本文来自于csdn,由火龙果软件Alice编辑、推荐。 前不久Iphone X发布,革命性的取消了TouchID(指纹识别),而添加了更酷的 FaceID(…

基于html5鼠标悬停图片动画展示效果

分享一款基于html5鼠标悬停图片动画展示效果。里面包含两款不同效果的html5图片展示效果。效果图如下&#xff1a; 在线预览 源码下载 实现的代码。 html代码&#xff1a; <div class"wrap" id"wrap"><div style"float: left; padding-top…

组件分享之后端组件——一个简单且高度可扩展的分布式文件系统seaweedfs

组件分享之后端组件——一个简单且高度可扩展的分布式文件系统seaweedfs 背景 近期正在探索前端、后端、系统端各类常用组件与工具&#xff0c;对其一些常见的组件进行再次整理一下&#xff0c;形成标准化组件专题&#xff0c;后续该专题将包含各类语言中的一些常用组件。欢迎大…

代理神器Charles4.2.8的破解

打开Charles&#xff0c;点击工具栏的Help&#xff0c;选择Register Charles&#xff0c;在两栏里分别输入即可。 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4

TLS加密套件

出于兴趣爱好&#xff0c;决定开发TLS1.2-1.3的一个库。为此阅读了TLS相关的若干RFC文档&#xff0c;以及查阅了多篇相关博客文章。最终有以下发现&#xff1a; 1. TLS定义了几百个加密套件(参考https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml)&#x…

sshd服务及防暴力破解 附赠防暴力破解脚本

利用yum源安装sshd服务客户端安装&#xff1a;openssh-clients.x86_64 服务端安装&#xff1a;openssh-server.x86_64Openssh和sshd有区别吗&#xff1f; 两个是不同的概念&#xff0c;软件包名称叫openshh 开机的服务叫sshd[rootserver1 ~]# rpm -ql openssh ###查看安装的…

The server selected protocol version TLS10 is not accepted by client preferences [TLS12]

最近在部署项目的时候遇到一个问题&#xff0c;卡了整整一天时间&#xff0c;所以感觉有必要po个解决方法出来给有需要的朋友参考一下。 问题描述&#xff1a;Caused by: javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10 is not accepted b…

TLS 1.3 协议详解

TLS 1.3 握手流程详解 我的TLS实现&#xff08;支持TLS1.3和国密SSL&#xff09;&#xff0c;大家可以学习参考&#xff1a;https://github.com/mrpre/atls/ 如果觉得有用&#xff0c;请打赏N元&#xff1a;http://39.98.242.44 需要的背景知识&#xff1a; &#xff08;1&am…

服务攻防-协议漏洞-FTPRDPSSHRsyncProFTPDlibsshOpenssh-Hydra工具使用口令猜解未授权访问

目录 一、导图 二、口令猜解-Hydra-FTP&RDP&SSH 1、协议介绍 2、Hydra工具介绍 3、实例演示 三、配置不当-未授权访问-Rsync 文件备份 1、Rsync介绍 2、漏洞成因——配置不当 3、实例演示 四、协议漏洞-应用软件-FTP&ProFTPD搭建 1、引入 2、ProFTPD介…

提示:The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]

JMeter连接SQLservice数据库。 1、测试计划添加sqljdbc41.jar 2、添加数据库配置 3、添加请求 3、按着上面的配置&#xff0c;执行&#xff0c;然后报错误了。 提示“Cannot create PoolableConnectionFactory (The driver could not establish a secure connection to SQL S…

SSH暴力破解

ssh暴力破解解决方案 https://www.cnblogs.com/walkingzq/p/8191900.html 最近在使用腾讯云服务器的过程中&#xff0c;被比特币黑客黑了一次服务器&#xff08;如下图所示&#xff09;。 图1 比特币勒索信息 继而认识到网络安全的重要性。在重新安装系统之后&#xff0c;发现…

SSL/TLS Cipher Suites

Cipher Suite 一个加密算法套件&#xff08;CipherSuite&#xff09;是一个四件套&#xff0c;由各类基础的加密算法组成&#xff0c;主要包含了四类&#xff1a; 1&#xff09;Key Exchange 密钥交换算法&#xff1b; 2&#xff09;Authentication 身份认证算法&#xff1b…