1

我想隐藏 URL 中的密码以进行记录。我希望通过解析、用虚拟密码替换密码和反解析来使用urlparse,但这给了我:

>>> from urllib.parse import urlparse
>>> parts = urlparse('https://user:pass@66.66.66.66/aaa/bbb')
>>> parts.password = 'xxx'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

所以替代方案似乎是this,这似乎有点矫枉过正。

有没有更简单的方法来替换密码,使用标准库?

4

1 回答 1

5

urlparse返回一个名为 tuple的(子类) 。使用该namedtuple._replace()方法生成一个新副本,并使用geturl()它来“解析”。

密码是netloc属性的一部分,可以进一步解析:

from urllib.parse import urlparse

def replace_password(url):
    parts = urlparse(url)
    if parts.password is not None:
        # split out the host portion manually. We could use
        # parts.hostname and parts.port, but then you'd have to check
        # if either part is None. The hostname would also be lowercased.
        host_info = parts.netloc.rpartition('@')[-1]
        parts = parts._replace(netloc='{}:xxx@{}'.format(
            parts.username, host_info))
        url = parts.geturl()
    return url

演示:

>>> replace_password('https://user:pass@66.66.66.66/aaa/bbb')
'https://user:xxx@66.66.66.66/aaa/bbb'
于 2016-12-08T10:24:16.247 回答