在 3.8+ 中从 URL 中分割用户名和密码(splituser 已弃用,没有替代方案)

Ber*_*ala 4 url python-3.x

尝试从 URL 中过滤掉用户密码。

(我可以通过最后一个“@”符号手动将其拆分,但我宁愿使用解析器)

Python 给出弃用警告,但urlparse()不处理用户/密码。

我应该只相信最后一个@符号,还是有新版本的分割用户?

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='')
Run Code Online (Sandbox Code Playgroud)

(编辑: repr() 输出是部分的且具有误导性;请参阅我的答案。)

Ber*_*ala 6

一切都在那里,清晰且易于访问。

出了什么问题:这里的 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'
Run Code Online (Sandbox Code Playgroud)

或者作为一句台词(我只需要域名):

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