【问题标题】:split username & password from URL in 3.8+ (splituser is deprecated, no alternative)从 3.8+ 中的 URL 拆分用户名和密码(不推荐使用拆分用户,别无选择)
【发布时间】:2020-10-01 11:49:32
【问题描述】:

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

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

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

我应该只信任最后一个-@-sign,还是有新版本的拆分用户?

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='')

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

【问题讨论】:

    标签: python-3.x url


    【解决方案1】:

    一切都在那里,清晰易懂。

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

    结果可通过显式属性获取:

    >>> 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
    

    【讨论】:

      【解决方案2】:

      source code for splituser,貌似他们只是用str.rpartition

      def splituser(host):
          warnings.warn("urllib.parse.splituser() is deprecated as of 3.8, "
                        "use urllib.parse.urlparse() instead",
                        DeprecationWarning, stacklevel=2)
          return _splituser(host)
      
      
      def _splituser(host):
          """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
          user, delim, host = host.rpartition('@')
          return (user if delim else None), host
      

      是的,取决于最后一次出现的 @

      编辑:urlparse 仍然拥有所有这些字段,请参阅 Berry 的回答

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        相关资源
        最近更新 更多