2013-06-04 60 views
1

我正在使用http.client尝试从主机读取xml文件。我会使用urllib2,但是我得到一个BadStatusLine,因为在xml头部之前有3个空格(我无法改变它)。这就是为什么我正在尝试这条路线。Python http.client getaddrinfo失败

我现在卡住了,我不断收到错误(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 
+1

尝试删除'的 'http://''您前面加上到IP。 – ejno

+0

这工作,但现在我再次得到一个badstatusline?我无法更改我得到的文件,并且它通过浏览器正常工作。有任何想法吗? – mad5245

回答

1

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

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

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

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

1

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

如果我使用

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

它工作得很好。

r = requests.get(url) 

弹出有错误

Traceback (most recent call last): File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.p y", line 516, in urlopen body=body, headers=headers) File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.p y", line 308, in _make_request conn.request(method, url, **httplib_request_kw) File "C:\Python34\lib\http\client.py", line 1090, in request self._send_request(method, url, body, headers) File "C:\Python34\lib\http\client.py", line 1128, in _send_request self.endheaders(body) File "C:\Python34\lib\http\client.py", line 1086, in endheaders self._send_output(message_body) File "C:\Python34\lib\http\client.py", line 924, in _send_output self.send(msg) File "C:\Python34\lib\http\client.py", line 859, in send self.connect() File "C:\Python34\lib\site-packages\requests\packages\urllib3\connection.py", line 146, in connect conn = self._new_conn() File "C:\Python34\lib\site-packages\requests\packages\urllib3\connection.py", line 125, in _new_conn (self.host, self.port), self.timeout, **extra_kw) File "C:\Python34\lib\site-packages\requests\packages\urllib3\util\connection. py", line 64, in create_connection for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): File "C:\Python34\lib\socket.py", line 530, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11001] getaddrinfo failed

相关问题