使用Python从html页面提取JSON数据

bcs8qyzn  于 2023-01-01  发布在  Python
关注(0)|答案(1)|浏览(603)

我对html和JSON还很陌生,在一个Raspberry Pi项目中,我在Python中以可用的格式提取数据时遇到了一些困难。
我使用的设备通过wifi链接以html页面的格式输出一些实时数据。虽然页面上显示的数据可以更改,但我现在只关心从单个页面获取数据。在记事本++中查看时,页面外观如下:

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"><style>.b{position:absolute;top:0;bottom:0;left:0;right:0;height:100%;background-color:#000;height:auto !important;}.f{border-radius: 10px;font-weight:bold;position:absolute;top:50%;left:0;right:0;margin:auto;background:#024d27;padding:50px;box-sizing:border-box;color:#FF0;margin:30px;box-shadow:0px 2px 18px -4px #0F0;transform:translateY(-50%);}#V{font-size:96px;}#U{font-size: 56px;}#N{font-size: 36px;}</style></head><body><div class="b"><div class="f"><span id="N">Voltage</span><br><span id="V">12.53</span>&nbsp;<span id="U">V</span><br></div></div><script>reqData();setInterval(reqData, 200);function reqData() {var xhr = new XMLHttpRequest();xhr.onload = function() {if (this.status == 200) {var data = JSON.parse(xhr.responseText);document.getElementById('N').innerHTML = data.n;document.getElementById('V').innerHTML = data.v;document.getElementById('U').innerHTML = data.u;} else {document.getElementById('N').innerHTML = "?";document.getElementById('V').innerHTML =  "?";document.getElementById('U').innerHTML = "?";}};xhr.open('GET', 'readVal', true);xhr.send();}</script></body></html>

正如你所看到的,这是一个相当简单的页面,它只是提供了我试图提取的信息,在一个绿色的框中呈现,黑色背景上有黄色文本。
从盯着信息一点点,我试图提取的信息是与跨度ID = 'V'(电压),'N'(名称)和'U'(单位)。
数据显示在网页上的生活(即更新每200毫秒(我认为)没有刷新页面),我想提取的值尽可能频繁。
我已经尝试了几个不同的代码块/方法,这似乎是唯一一个,我目前能够获得任何成功:

import urllib.request, json, html

data = urllib.request.urlopen("http://192.168.4.1").read()

print (data)

这将正确地返回页面的html源代码(尽管延迟了大约5秒,这可能与我运行它的Pi Zero的低规格有关)。
但是,我似乎无法从中提取JSON数据。我尝试过:

data_json = json.loads(data)

但这会产生一个JSON解码错误:预期值:第1行第1列(字符0),我假设这是因为'数据'是HTML代码和JSON的混合。我还注意到,当我使用urllib打开页面时,我试图检索的实际变量信息(Voltage,12.53 & V,来自顶部的示例源页面)只是显示为'?'占位符,而不是加载页面上显示的实际值。
有谁能给我点建议吗?
先谢了史蒂夫

mkshixfv

mkshixfv1#

正如你从错误信息和原始HTML代码中注意到的,你从设备上得到的结果不是json数据,而是带有javascript的html,看起来你发布的HTML向某个本地端点(可能是/readVal?)发出了 AJAX 请求(javascript GET请求)。
试着在浏览器中打开http://192.168.4.1,打开开发工具,观察页面发出的网络请求--特别是一些XHR请求,查看请求URL和响应--我打赌你会发现一些本地端点返回你想要的原始json数据。
或者试试http://192.168.4.1/readVal,看看是否就是这样。

相关问题