我有一个设备,它有一个简单的 Web 服务器,其中有一个带有 XML 的页面。我想用 Python 3.4 捕获结果。该网站看起来与该页面的源代码完全相同。
<?xml version="1.0" encoding="utf-8"?>
<datavalues>
<units>F</units>
<sensor1temp>67.5</sensor1temp>
<sensor2temp>57.9</sensor2temp>
<sensor3temp>54.6</sensor3temp>
<sensor4temp>x.x</sensor4temp>
<relay1state>0</relay1state>
<relay2state>0</relay2state>
</datavalues>
我使用的代码非常简单,如下所示:
import urllib.request
url_str = 'http://192.168.1.2/state.xml'
f = urllib.request.urlopen(url_str).read()
print (f)
我收到一个如下所示的异常:
http.client.BadStatusLine: <?xml version="1.0" encoding="utf-8"?>
我对响应进行了 Wireshark 处理。数据以四个 block Frame11/以太网 II/互联网协议(protocol)版本 4/TCP 的形式返回。 xml 的数据包含在第 11 帧部分中。不太确定这意味着什么。
我在工作中使用 Jython 2.5,上述技术效果很好。有可用的 Python 3.4 解决方案吗?非常感谢您的帮助。谢谢。
最佳答案
看起来服务器直接回复数据而不提供状态代码,就像 HTTP/0.9 那样。显然 urllib.request 不支持这一点。幸运的是,HTTP/0.9 是一个简单的协议(protocol),因此使用普通套接字应该很容易实现:
import socket
from io import BytesIO
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect(('192.168.1.2', 80))
conn.send(b'GET /state.xml\r\n')
buffer = BytesIO()
while True:
chunk = conn.recv(4096)
if chunk:
buffer.write(chunk)
else:
break
data = buffer.getvalue()
关于python - Python 3.4 和阅读这个简单的 XML 站点有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27393282/