【问题标题】:How to request a url with non-unicode carachters on main domainname (not params) in Python?如何在 Python 中请求主域名(不是参数)上带有非 unicode 字符的 url?
【发布时间】:2023-12-16 01:23:01
【问题描述】:

我无法使用 urllib2.urlopen() 请求 url“http://www.besondere-raumdüfte.de”。
我尝试使用带有 utf-8、idna、ascii 的 urllib.urlencode 对字符串进行编码,但仍然无法正常工作。
提高URLError: <urlopen error unknown url type

【问题讨论】:

  • "ü" 不是“非 Unicode 字符”。几乎没有 任何字符 有资格作为“非 Unicode 字符”,因为 Unicode 几乎涵盖了所有类似字符的东西。这是一个“非 ASCII 字符”。

标签: python unicode urllib2 urlopen


【解决方案1】:

您使用的是iri 而不是uri,您需要做的是正确转换它。以下是如何做到这一点的示例:

from httplib2 import iri2uri

def iri_to_uri(iri):
    """Transform a unicode iri into a ascii uri."""
    if not isinstance(iri, unicode):
        raise TypeError('iri %r should be unicode.' % iri)
    return bytes(iri2uri(iri))

一旦你有了一个 uri,你应该可以使用 urllib2。

【讨论】:

  • 检查我试过urllib2.urlopen(bytes(iri2uri("http://www.besondere-raumdüfte.de"))) 但给出了错误: URLError:
  • 你可能在防火墙后面,看看*.com/questions/4847649/…
  • 很有趣,但这是因为我忘了把 u 放在字符串 quot 之前 :) 在我把它放在它工作之后。我猜你将字符串定义为 unicode 字符串。谢谢。
【解决方案2】:

您需要的是u"http://www.besondere-raumdüfte.de/".encode('idna')。请注意源字符串如何是 Unicode 常量(u 前缀)。

结果是一个可用于urlopen() 的 URL。

如果您的域名包含非 ASCII 字符并且 URL 的其余部分包含非 ASCII 字符,您需要 .encode('idna') 域部分和 iri2uri() 其余部分。

【讨论】:

  • 谢谢它的工作,我记得我尝试用'idna'和urllib2.urlopen 编码字符串开头没有你,但在字符串之前确实有'u'。
  • @AbdyresulCharyev:哦,是的,使用字节字符串而不是 Unicode 字符串是最常见的错误之一,我自己做了很多次 %)
最近更新 更多