urllib.error.URLError:<urlopen error =“”[errno =“”11002] =“”getaddrinfo =“”failed =“”>?

时间:2016-03-07 03:37:08

标签: python sockets beautifulsoup urllib

所以,我的代码只有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错误[Errno 11002]”,特别是在stackoverflow上,没有回复任何帮助(实际上对于此错误没有太多问题被问到11002。)
  2. 所以然后我尝试用另一个网站“http://python-data.dr-chuck.net/known_by_Fikret.html”替换urlopen函数中的网站参数(即“http://www.pythonlearn.com/code/urllinks.py”)。它运作得很好。没有错误出现。
  3. 所以我猜这个错误必须与这个特定的网站本身有关。该网站有点动态,我的意思是它的内容会改变并变成另一个完全不同的东西。但我没有更多的知识,只是为了描述我看到的东西。
  4. 以及更长和完整版本的错误:

    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>
    

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

这是DNS的问题;显然你的python程序无法解析你提供的URL的主机名。也许DNS正在运行的主机上配置错误?

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