使用Python将UTF-8解码为URL

时间:2016-07-04 14:19:10

标签: python encoding utf-8

我在utf-8中编码了以下网址。

url_input = u'https://www.gumtree.com//p/uk-holiday-rentals/1bedroon-flat-\xa3250pw-all-bills-included-/1174092955'

我需要废弃此网页,为此我需要使用以下url_output(不读取unicode)。

url_output=https://www.gumtree.com//p/uk-holiday-rentals/1bedroon-flat-£250pw-all-bills-included-/1174092955

当我打印url_input时,我得到url_output:

print(url_input)
https://www.gumtree.com//p/uk-holiday-rentals/1bedroon-flat-£250pw-all-bills-included-/1174092955

但是我找不到将url_input转换为url_output的方法。根据论坛,print函数在Python 2.7上使用ascii解码,但是ascii不应该读取\xa3并且url_input.encode('ASCII')不起作用。

有人知道如何解决这个问题吗? 提前致谢 !

2 个答案:

答案 0 :(得分:2)

当您打印url_input时,您只能获得所需的url_output,因为您的终端了解UTF-8并且可以正确代表\xa3

您可以使用str.encode对ASCII字符串进行编码,但必须替换(使用?)或忽略不是ascii的字符:

url_output = url_input.encode("ascii", "replace")
print(url_output)

会打印:

https://www.gumtree.com//p/uk-holiday-rentals/1bedroon-flat-?250pw-all-bills-included-/1174092955

url_output = url_input.encode("ascii", "ignore")
print(url_output)

会打印:

https://www.gumtree.com//p/uk-holiday-rentals/1bedroon-flat-250pw-all-bills-included-/1174092955

您无法获取带有£ ascii字符的输出字符串,因为此字符的值大于127。

答案 1 :(得分:1)

经过一些测试,我可以确认服务器接受不同格式的URL:

  • 原始utf8编码的网址:

    url_output = url_input.encode('utf8')
    
  • %编码的latin1网址

    url_output = urllib.quote_plus(url_input.encode('latin1'), '/:')
    
  • %编码的utf8网址

    url_output = urllib.quote_plus(url_input.encode('utf8'), '/:')
    

由于原始latin1未被接受并导致错误的URL错误,并且因为在URL中传递非ascii字符可能不安全,我的建议是使用第三种方式。它给出了:

    print url_output

    https://www.gumtree.com//p/uk-holiday-rentals/1bedroon-flat-%C2%A3250pw-all-bills-included-/1174092955