无法从 urllib.request.urlopen 获得以点结尾的 url 的响应

Can not get response from urllib.request.urlopen with an url ending with a dot

我有一个看起来像这样的脚本,用户名以“.”结尾。点.

import urllib.request

url = "https://likee.video/@evadecarle."
response = urllib.request.urlopen(url)
print(response)

结束点“.”在 url 似乎引起了问题。 如果我将 url 更改为 url = "https://likee.video/@11Happyness07.12" 它工作正常。 我如何使它与结束点“。”一起使用?

如果我们尝试使用 urllib.requests 获取 https://likee.video/@evadecarle.,我们会看到:

>>> import urllib.request
>>> response = urllib.request.urlopen('https://likee.video/@evadecarle.')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.10/urllib/request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib64/python3.10/urllib/request.py", line 525, in open
    response = meth(req, response)
  File "/usr/lib64/python3.10/urllib/request.py", line 634, in http_response
    response = self.parent.error(
  File "/usr/lib64/python3.10/urllib/request.py", line 563, in error
    return self._call_chain(*args)
  File "/usr/lib64/python3.10/urllib/request.py", line 496, in _call_chain
    result = func(*args)
  File "/usr/lib64/python3.10/urllib/request.py", line 643, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 302: Moved Temporarily
>>>

它失败了,因为远程网站正在返回 302 状态代码 (http 重定向)。通常,您会使用一个 HTTPRedirectHandler,类似于:

>>> opener = urllib.request.build_opener(urllib.request.HTTPRedirectHandler(), urllib.request.HTTPHandler(debuglevel=0))
>>> resp = opener.open('https://google.com')
>>> resp.url
'https://www.google.com/'

不幸的是,URL https://likee.video/@evadecarle. 是一个奇数 一:它 returns 一个 302 状态码,但不包括 Location: header 识别重定向目标。

因此,urllib 似乎处理不当。 其他人可能会就此纠正我,但它看起来像 requests 库可以毫无问题地处理这个问题:

>>> resp = requests.get('https://likee.video/@evadecarle.')
>>> resp
<Response [302]>
>>> resp.text[:80]
'<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="robots" c'

所以使用 requests 模块可能是最简单的解决方案。