【问题标题】:How to convert a UTF-8 string to URL compliant string in Python?如何在 Python 中将 UTF-8 字符串转换为符合 URL 的字符串?
【发布时间】:2012-08-08 10:48:10
【问题描述】:

我确定我不是第一个遇到这个问题的人。但是经过数小时的调试、谷歌搜索和 StackOverflow-ing 没有找到答案,我决定发布这个问题。如果我错过了什么,请提前抱歉,但现在,我很困惑。

我正在使用 BeautifulSoup 来解析 UTF-8 网站。我正在使用网站上的文本来构建一个 URL 以进一步抓取。我遇到了一些非英文字符的问题。

例如:站点包含字符串Originální formule,我想用它来构建URL:http://blahblah.com/Originální-formulehttp://blahblah.com/origin%C3%A1ln%C3%AD-formule。问题是,我收到http://blahblah.com/Origin\xe1ln\xed-formule,这会产生错误。我尝试了编码、解码等等,但我仍然无法获得正确的 URL。

顺便说一句,当我print u'Origin\xe1ln\xed-formule' 时,字符串打印得很好。它只是编码不成功。

我做错了什么?

【问题讨论】:

  • ...我们不知道。你在做什么
  • 问题是,如何将字符串 u'Origin\xe1ln\xed-formule' 转换为可以与 urllib2/urllib.urlopen() 一起使用的字符串?
  • 你试过the urlencode function吗?
  • @l4mpi urlencode 不接受字符串作为参数。它用于将参数编码为参数字符串。这不是我的情况。不过,SanSS 的答案是正确的。

标签: python unicode utf-8 urllib2 urllib


【解决方案1】:

为了达到你的期望,你必须做以下事情:

  1. 分解网址
  2. 获取路径部分并将其编码为 utf-8
  3. 引用路径
  4. 加入每个部分以获取引用的 URL

您可以结合使用以下功能来执行这些操作:

  • urlparse.urlparse (docs)
  • urllib.quote (docs)
  • urlparse.unparse (docs)

代码最终会是这样的:

from urlparse import urlparse, urlunparse
from urllib import quote
x = u'http://blahblah.com/Originální-formule'
parsed_url = list(urlparse(x.encode('utf-8')))
parsed_url[2] = quote(parsed_url[2])
urlunparse(parsed_url)

结果:http://blahblah.com/Origin%C3%A1ln%C3%AD-formule

【讨论】:

  • 我不需要拆分网址并重新加入。但我需要做的确实是将其编码为 utf-8 然后引用它。谢谢!
  • 如果主机名中包含非 ASCII 字符,则需要拆分它,因为它们需要使用 Punycode 算法 (IDNA) 而不是 UTF-8+%-encode 进行编码。
猜你喜欢
  • 2016-05-16
  • 2014-03-07
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2011-05-10
  • 2010-09-21
  • 2015-11-14
相关资源
最近更新 更多