【问题标题】:label empty or too long - python urllib2标签为空或太长 - python urllib2
【发布时间】:2014-09-26 00:12:30
【问题描述】:

我遇到了一个奇怪的情况:

我正在像这样卷曲网址:

def check_urlstatus(url):
  h = httplib2.Http()
  try:
      resp = h.request("http://" + url, 'HEAD')        
      if int(resp[0]['status']) < 400:
          return 'ok'
      else:
          return 'bad'
  except httplib2.ServerNotFoundError:
      return 'bad'

如果我尝试使用以下方法进行测试:

if check_urlstatus('.f.de') == "bad": #<--- error happening here
   #..
   #..

它在说:

UnicodeError: label empty or too long

我在这里造成的问题是什么?

编辑:这是 idna 的回溯。我猜,它试图将输入拆分为.,在这种情况下,第一个标签是空的,这是第一个. 之前的速度。

【问题讨论】:

  • 我做了同样的事情,除了你捕获的一个异常,它没有抛出任何异常。你用的是什么 Python 版本?
  • 我正在使用 python 2.7 @PankajSharma
  • 我也用过。工作正常。
  • @PankajSharma 在空闲时工作正常。在实际通话中,它给了我上面的错误

标签: python urllib2


【解决方案1】:

问题是您的 URL 无法按照 IDNA rules 正确编码,它控制着国际化域名的转换方式:

域名的 ASCII 和非 ASCII 形式之间的转换是 通过称为 ToASCII 和 ToUnicode 的算法完成。这些 算法并不适用于整个域名,而是 到个别标签。例如,如果域名是 www.example.com,则标签为 www、example 和 com。 ToASCII 或 ToUnicode 分别应用于这三个中的每一个

这两种算法的细节很复杂,在 RFC 3490。下面概述了它们的功能。

ToASCII 保持任何 ASCII 标签不变,但如果标签会失败 不适合域名系统。如果给定的标签包含 至少一个非 ASCII 字符,ToASCII 将应用 Nameprep 算法,将标签转换为小写并执行其他 规范化,然后将结果转换为 ASCII 使用 Punycode[16] 之前添加四个字符的字符串“xn--”。[17] 这四个字符的字符串称为 ASCII Compatible Encoding (ACE) 前缀,用于区分 Punycode 编码标签和 普通的 ASCII 标签。 ToASCII 算法可能以多种方式失败; 例如,最后的字符串可能超过 63 个字符的限制 DNS 名称。 ToASCII 失败的标签不能用于 国际化域名。

在您的情况下,''(空白)不是有效的域名字符,您最终会得到:

>>> '.f.de'.encode('idna')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/encodings/idna.py", line 164, in encode
    result.append(ToASCII(label))
  File "/usr/lib/python2.6/encodings/idna.py", line 73, in ToASCII
    raise UnicodeError("label empty or too long")
UnicodeError: label empty or too long

如果您将域名更改为“a.f.de”,则不应引发此异常。

【讨论】:

  • 是的,谢谢伙计,这正是这里发生的事情。如何针对此失败引发异常,以便我可以说 url 无效?
  • 您可以捕获UnicodeError 异常,就像您正在捕获httplib2.ServerNotFoundError 异常一样。
  • 哦,好吧,我明白了。 except UnicodeError。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多