Python http.client getaddrinfo失败了

时间:2013-06-04 15:40:28

标签: python http python-3.3 httpconnection getresponse

我正在使用http.client尝试从主机读取xml文件。我会使用urllib2,但我得到一个BadStatusLine,因为在xml标题之前有3个空格(我不能改变它)。这就是我尝试这条路线的原因。

我现在陷入困境并且我一直收到错误(getaddrinfo失败)。

下面是我的代码,下面是回溯。有人可以告诉我做错了吗?

仅供参考,浏览器上的地址为http://machineIP:81/command=AB&time=2013-06-02

我没有问题以这种方式访问​​xml。

提前感谢您的帮助!

代码:

import http.client
import datetime

IP = input("Enter the IP: ")
PT = str(81)
F1 = datetime.date.today() - datetime.timedelta(days=2)

print("Reading File...")
html = http.client.HTTPConnection('http://' + IP  , port= PT)
html.request("GET", '/command=AB&time=' + str(F1))
r1 = html.getresponse()

print("Writing to file...")
out = r1.read()
f = open('Files/' + IP + '-' + str(F1) + '.xml', 'wb')
print("Writing to file...")
f.write(out)
f.close()
print("Done.")

回溯:

C:\Users\Me\Desktop\Coding>python file.py
Enter the IP: *.***.***.***
Reading File...
Traceback (most recent call last):
  File "file.py", line 10, in <module>
    html.request("GET", '/command=AB&time=' + str(F1))
  File "C:\Python33\lib\http\client.py", line 1049, in request
    self._send_request(method, url, body, headers)
  File "C:\Python33\lib\http\client.py", line 1087, in _send_request
    self.endheaders(body)
  File "C:\Python33\lib\http\client.py", line 1045, in endheaders
    self._send_output(message_body)
  File "C:\Python33\lib\http\client.py", line 890, in _send_output
    self.send(msg)
  File "C:\Python33\lib\http\client.py", line 828, in send
    self.connect()
  File "C:\Python33\lib\http\client.py", line 806, in connect
    self.timeout, self.source_address)
  File "C:\Python33\lib\socket.py", line 406, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno 11004] getaddrinfo failed

2 个答案:

答案 0 :(得分:1)

所以我明白了。为了避免badStatusLines和其他类似的错误,我使用了socket / urllib2。这样您就可以从网页上获取原始信息,而不必担心任何无法控制的问题。

这里是添加了套接字的代码片段。

socket.setdefaulttimeout(timeout)
req = urllib2.Request(host)
response = urllib2.urlopen(req)

这是我迄今为止唯一取得的成功。感谢ejno让我走上正轨。

答案 1 :(得分:1)

Windows添加了&#34;换行符&#34;最后的字符(&#39; \ n&#39;)与unix Windows = CRLF不同。我正在阅读Windows ASCII文本文件,并遇到了类似的问题。如果我只是将文件读入列表并打印出来,它会在两者之间添加一个空行。这给了我一个线索。我正在使用建立在urllib3之上的Requests库。

如果我使用

r = requests.get(url.strip('\n')) 

它运作得很好。

r = requests.get(url)

爆炸出错

  

Traceback(最近一次调用最后一次):文件   &#34; C:\ Python34 \ lib中\站点包\请求\包\ urllib3 \ connectionpool.p   y&#34;,第516行,在urlopen中       body = body,headers = headers)文件&#34; C:\ Python34 \ lib \ site-packages \ requests \ packages \ urllib3 \ connectionpool.p   y&#34;,第308行,在_make_request中       conn.request(method,url,** httplib_request_kw)文件&#34; C:\ Python34 \ lib \ http \ client.py&#34;,第1090行,请求中       self._send_request(方法,url,正文,标题)文件&#34; C:\ Python34 \ lib \ http \ client.py&#34;,第1128行,在_send_request中       self.endheaders(body)文件&#34; C:\ Python34 \ lib \ http \ client.py&#34;,第1086行,在endheaders中       self._send_output(message_body)文件&#34; C:\ Python34 \ lib \ http \ client.py&#34;,第924行,在_send_output中       self.send(msg)文件&#34; C:\ Python34 \ lib \ http \ client.py&#34;,第859行,发送       self.connect()File&#34; C:\ Python34 \ lib \ site-packages \ requests \ packages \ urllib3 \ connection.py&#34;,   第146行,在连接中       conn = self._new_conn()文件&#34; C:\ Python34 \ lib \ site-packages \ requests \ packages \ urllib3 \ connection.py&#34;,   第125行,在_new_conn中       (self.host,self.port),self.timeout,** extra_kw)文件&#34; C:\ Python34 \ lib \ site-packages \ requests \ packages \ urllib3 \ util \ connection。   py&#34;,第64行,在create_connection中       for socket.getaddrinfo(host,port,0,socket.SOCK_STREAM):getaddrinfo中的文件&#34; C:\ Python34 \ lib \ socket.py&#34;,530行       for _socket.getaddrinfo(host,port,family,type,proto,flags):socket.gaierror:[Errno 11001] getaddrinfo failed