标签为空或太长-python urllib2

发布于 2021-01-29 14:58:45

我遇到一个奇怪的情况:

我正在卷曲这样的网址:

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的追溯。我猜想,它会尝试按分割输入.,在这种情况下,第一个标签为空,这是第一个标签之前的速度.

在此处输入图片说明

关注者
0
被浏览
299
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    问题是您的URL无法按照IDNArules正确编码,该规则控制如何转换国际化域名:

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

    这两种算法的细节很复杂,并且在RFC 3490中进行了指定。以下概述了它们的功能。

    ToASCII保留任何ASCII标签不变, 但如果该标签不适用于域名系统则会失败。
    如果给定的标签至少包含一个非ASCII字符,则ToASCII将应用Nameprep算法,该算法会将标签转换为小写并执行其他归一化处理,然后在使用四个字符之前,先使用Punycode
    [16]将结果转换为ASCII。字符串“ xn-”。[17]
    这四个字符的字符串称为ASCII兼容编码(ACE)前缀,用于区分Punycode编码的标签和普通的ASCII标签。ToASCII算法可能会以多种方式失败。例如,最终字符串可能超过DNS名称的63个字符的限制。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
    

    如果将域名更改为“ afde”,则不应引发此异常。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看