使用python替换url中的端口

时间:2016-01-27 10:08:25

标签: python

我想更改给定网址中的端口。

OLD = http://test:7000/vcc3 NEW = http://test:7777/vcc3

我尝试了以下代码,我可以更改URL但无法更改端口。

>>> from urlparse import urlparse
>>> aaa = urlparse('http://test:7000/vcc3')
>>> aaa.hostname
test
>>> aaa.port
7000
>>>aaa._replace(netloc=aaa.netloc.replace(aaa.hostname,"newurl")).geturl()
'http://newurl:7000/vcc3'
>>>aaa._replace(netloc=aaa.netloc.replace(aaa.port,"7777")).geturl()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected a character buffer object

3 个答案:

答案 0 :(得分:4)

这不是一个特别好的错误消息。这是抱怨,因为您将ParseResult.port int传递给字符串的replace方法,该方法需要str。在传递它之前,只需将port字符串化:

aaa._replace(netloc=aaa.netloc.replace(str(aaa.port), "7777"))

我很惊讶没有一种使用urlparse库设置端口的简单方法。这感觉就像一个疏忽。理想情况下,你可以说parseresult._replace(port=7777),但唉,that doesn't work

答案 1 :(得分:3)

端口的详细信息存储在netloc中,因此您只需执行以下操作:

>>> a = urlparse('http://test:7000/vcc3')
>>> a._replace(netloc='newurl:7777').geturl()
'http://newurl:7777/vcc3'
>>> a._replace(netloc=a.hostname+':7777').geturl()  # Keep the same host
'http://test:7777/vcc3'

答案 2 :(得分:0)

问题在于ParseResult的'port'成员受到保护,您无法更改属性-don't事件,请尝试使用private _replace()方法。解决方案在这里:

from urllib.parse import urlparse, ParseResult

old = urlparse('http://test:7000/vcc3')
new = ParseResult(scheme=a.scheme, netloc="{}:{}".format(old.hostname, 7777),
                  path=old.path, params=old.params, query=old.query, fragment=old.fragment)
new_url = new.geturl()

第二个想法是将ParseResult转换为list->稍后将其更改为:

Changing hostname in a url

BTW'urlparse'库在该区域不灵活!