urllib.error.URLError: <urlopen error [Errno 11002] getaddrinfo failed>?

urllib.error.URLError: <urlopen error [Errno 11002] getaddrinfo failed>?

所以,我的代码只有 4 行。我正在尝试连接到一个网站,之后我想做什么是无关紧要的,因为错误是在没有其他代码的情况下产生的。

import urllib.request
from bs4 import BeautifulSoup 

html=urllib.request.urlopen('http://python-data.dr-chuck.net/known_by_Fikret.html').read()
soup=BeautifulSoup(html,'html.parser')

及错误(简要总结一):

for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11002] getaddrinfo failed
During handling of the above exception, another exception occurred:
urllib.error.URLError: <urlopen error [Errno 11002] getaddrinfo failed>

这是我试过的。

  1. 我在 google 上搜索了返回“urlopen error [Errno 11002]” 的错误,尤其是在 Whosebug 上,没有返回任何有用的信息(事实上,关于这个错误 11002 的问题并不多)。
  2. 然后我尝试替换网站参数(即“http://python-data.dr-chuck.net/known_by_Fikret.html" ) inside the urlopen function with another website "http://www.pythonlearn.com/code/urllinks.py”。它工作得很好。没有出现错误。
  3. 所以我想这个错误一定与这个特定网站本身有关。该网站有点动态,我的意思是它的内容会改变并变成另一种完全不同的东西。但是我没有更多的知识,只能描述我所看到的。

以及更长更完整的错误版本:

Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 1240, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\http\client.py", line 1083, in request
self._send_request(method, url, body, headers)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\http\client.py", line 1128, in _send_request
self.endheaders(body)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\http\client.py", line 1079, in endheaders
self._send_output(message_body)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\http\client.py", line 911, in _send_output
self.send(msg)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\http\client.py", line 854, in send
self.connect()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\http\client.py", line 826, in connect
(self.host,self.port), self.timeout, self.source_address)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\socket.py", line 693, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\socket.py", line 732, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11002] getaddrinfo failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "D:/baiduyundownload/Tempo/Active/Python/Python Examples/Fileanalysis11111.py", line 4, in <module>
html=urllib.request.urlopen('http://python-data.dr-chuck.net/known_by_Fikret.html').read()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 162, in urlopen
return opener.open(url, data, timeout)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 465, in open
response = self._open(req, data)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 483, in _open
'_open', req)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 443, in _call_chain
result = func(*args)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 1268, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 1242, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 11002] getaddrinfo failed>

这意味着您的 DNS 系统无法正常工作,或者您必须在您的网络上使用代理并且它没有正确定义。

如果您需要使用代理,请将环境变量 HTTP_PROXY(以及可选的 HTTPS_PROXY)设置为适合您网络的正确配置。格式为http://proxy.example.com:80;如果您的代理需要用户名和密码,您应该将其传入,如下所示:http://username:password@proxy.example.com:80.

对于 DNS 问题,请尝试从命令行查找域。打开命令提示符并键入 nslookup python-data.dr-chuck.net 并查看它是否 returns 给你一个 IP 地址。

这是 DNS 的问题;显然,您的 python 程序无法解析您提供的 URL 的主机名。也许 DNS 在 运行 所在的主机上配置不当?

此外,我可以推荐使用 requests 库吗?这是一个更好、更易于使用的模块来执行 Web 请求。你会在这里找到它:https://pypi.python.org/pypi/requests