1

我正在使用 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
4

2 回答 2

1

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

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

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

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

于 2013-06-10T17:48:10.167 回答
1

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

如果我使用

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

它工作得很好。

r = requests.get(url)

有错误的炸弹

py",第 859 行,在发送 self.connect() 文件中 "C:\Python34\lib\site-packages\requests\packages\urllib3\connection.py",第 146 行,在 connect conn = self._new_conn() 文件中“C:\Python34\lib\site-packages\requests\packages\urllib3\connection.py”,第 125 行,在 _new_conn (self.host, self.port), self.timeout, **extra_kw) 文件“C: \Python34\lib\site-packages\requests\packages\urllib3\util\connection。py”,第 64 行,在 socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) 中的 res 的 create_connection 中:文件“C:\Python34\lib\socket.py”,第 530 行,在 getaddrinfo 中用于 _socket 中的 res。 getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11001] getaddrinfo failed \Python34\lib\site-packages\requests\packages\urllib3\connection.py”,第 146 行,在 connect conn = self._new_conn() 文件“C:\Python34\lib\site-packages\requests\packages\urllib3 \connection.py”,第 125 行,在 _new_conn (self.host, self.port), self.timeout, **extra_kw) 文件“C:\Python34\lib\site-packages\requests\packages\urllib3\util\联系。py”,第 64 行,在 socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) 中的 res 的 create_connection 中:文件“C:\Python34\lib\socket.py”,第 530 行,在 getaddrinfo 中用于 _socket 中的 res。 getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11001] getaddrinfo failed \Python34\lib\site-packages\requests\packages\urllib3\connection.py”,第 146 行,在 connect conn = self._new_conn() 文件“C:\Python34\lib\site-packages\requests\packages\urllib3 \connection.py”,第 125 行,在 _new_conn (self.host, self.port), self.timeout, **extra_kw) 文件“C:\Python34\lib\site-packages\requests\packages\urllib3\util\联系。py”,第 64 行,在 socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) 中的 res 的 create_connection 中:文件“C:\Python34\lib\socket.py”,第 530 行,在 getaddrinfo 中用于 _socket 中的 res。 getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11001] getaddrinfo failed \Python34\lib\site-packages\requests\packages\urllib3\connection.py",第 125 行,在 _new_conn (self.host, self.port), self.timeout, **extra_kw) 文件“C:\Python34\ lib\site-packages\requests\packages\urllib3\util\connection。py”,第 64 行,在 socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) 中的 res 的 create_connection 中:文件“C:\Python34\lib\socket.py”,第 530 行,在 getaddrinfo 中用于 _socket 中的 res。 getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11001] getaddrinfo failed \Python34\lib\site-packages\requests\packages\urllib3\connection.py",第 125 行,在 _new_conn (self.host, self.port), self.timeout, **extra_kw) 文件“C:\Python34\ lib\site-packages\requests\packages\urllib3\util\connection。py”,第 64 行,在 socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) 中的 res 的 create_connection 中:文件“C:\Python34\lib\socket.py”,第 530 行,在 getaddrinfo 中用于 _socket 中的 res。 getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11001] getaddrinfo failed

于 2014-10-31T04:26:49.307 回答