python - Python 3.4 和阅读这个简单的 XML 站点有什么关系?

标签 python xml wireshark

我有一个设备,它有一个简单的 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/

相关文章:

jquery - 本地 xml 文件上的 IE JQuery ajax parseerror

java - 1 两个FrameLayout中的类

c# - XmlDocument 和 XDocument 处理之间的区别 &#x0;

python - 如何在输入的同一行打印?

python - 按 x 比例缩放 matplotlib.pyplot.Axes.scatter markersize

c - arp请求和回复使用c socket编程

c - 如何在不丢失的情况下捕获所有 udp 消息,如 Wireshark?

linux - 挖掘查询 ID 如何工作?

python - 使用 Python cgi 和表单进行工作。空输入错误

python - 如何干净地将常量与函数关联起来?