Python 3.x 拆分用户名&;3.8+;(splituser已弃用,无其他选择)

Python 3.x 拆分用户名&;3.8+;(splituser已弃用,无其他选择),python-3.x,url,Python 3.x,Url,正在尝试从URL中筛选出用户密码 (我本可以用最后一个'@'符号手动拆分它,但我更愿意使用解析器) Python给出了一个弃用警告,但是urlparse()不处理用户/密码 我应该信任最后一个@符号,还是有新版本的split user Python 3.8.2 (default, Jul 16 2020, 14:00:26) [GCC 9.3.0] on linux >>> url="http://usr:pswd@www.site.com/path&var

正在尝试从URL中筛选出用户密码

(我本可以用最后一个'@'符号手动拆分它,但我更愿意使用解析器)

Python给出了一个弃用警告,但是
urlparse()
不处理用户/密码

我应该信任最后一个@符号,还是有新版本的split user

Python 3.8.2 (default, Jul 16 2020, 14:00:26) 
[GCC 9.3.0] on linux
>>> url="http://usr:pswd@www.site.com/path&var=val"
>>> import urllib.parse

>>> urllib.parse.splituser(url)
<stdin>:1: DeprecationWarning: urllib.parse.splituser() is deprecated as of 3.8, use urllib.parse.urlparse() instead
('http://usr:pswd', 'www.site.com/path&var=val')

>>> urllib.parse.urlparse(url)
ParseResult(scheme='http', netloc='usr:pswd@www.site.com', path='/path&var=val', params='', query='', fragment='') 

#neigher with allow_fragments:

>>> urllib.parse.urlparse(url,allow_fragments=True)
ParseResult(scheme='http', netloc='us:passw@ktovet.com', path='/all', params='', query='var=val', fragment='')
Python 3.8.2(默认,2020年7月16日14:00:26)
linux上的[GCC 9.3.0]
>>>url=”http://usr:pswd@www.site.com/path&var=val“
>>>导入urllib.parse
>>>urllib.parse.splituser(url)
:1:不推荐使用警告:urllib.parse.splituser()从3.8开始不推荐使用,请改用urllib.parse.urlparse()
('http://usr:pswd“,”www.site.com/path&var=val')
>>>urllib.parse.urlparse(url)
ParseResult(scheme='http',netloc='usr:pswd@www.site.com,path='/path&var=val',params='',query='',fragment='')
#与允许碎片相邻:
>>>urllib.parse.urlparse(url,allow_fragments=True)
ParseResult(scheme='http',netloc='us:passw@ktovet.com,path='/all',params='',query='var=val',fragment='')
(编辑:repr()输出是部分的&误导性的;请参见我的答案。)

查看,看起来他们只是使用:

def拆分用户(主机):
warnings.warn(“urllib.parse.splituser()从3.8开始就不推荐使用,”
“改为使用urllib.parse.urlparse()”,
弃用警告,堆栈级别=2)
返回用户(主机)
def_splituser(主机):
“拆分用户('user[:passwd]@host[:port]')-->'user[:passwd]','host[:port]'。”
用户,delim,host=host.rpartition(“@”)
返回(如果没有,则为用户),主机
是,取决于上次出现的
@


正如弃用信息所示,我无法使用
urlparse
找到等效的替代方案。

一切都在那里,清晰易懂

出了什么问题:这里的repr()有误导性,只显示了很少的属性/值(为什么?这是另一个问题)

结果可通过显式属性get获得:

>>> url = 'http://usr:pswd@www.sharat.uk:8082/nativ/page?vari=valu'
>>> p = urllib.parse.urlparse(url)

>>> p.port
8082
>>> p.hostname
'www.sharat.uk'
>>> p.password
'pswd'
>>> p.username
'usr'
>>> p.path
'/nativ/page'
>>> p.query
'vari=valu'
>>> p.scheme
'http'
或者作为一行程序(我只需要域):

>>> urllib.parse.urlparse('http://usr:pswd@www.sharat.uk:8082/nativ/page?vari=valu').hostname
www.shahart.uk