树莓派项目:Python从实时HTML页面提取JSON数据的问题
解决方法
你现在的问题在于请求的是静态HTML页面,而真实数据是通过前端JS调用readVal接口动态获取的,所以HTML源码里只有占位符,不是实时数据。直接请求readVal接口就能拿到纯JSON数据,不用解析HTML。
步骤1:直接请求数据接口
把请求的URL改成设备的readVal接口地址,通常是http://192.168.4.1/readVal(如果前端JS里的请求路径是相对路径的话)。
基于你现有代码的修改版本
import urllib.request import json import time # 实时获取数据的循环 while True: try: # 请求readVal接口 response = urllib.request.urlopen("http://192.168.4.1/readVal") # 读取并解码为字符串 data_str = response.read().decode('utf-8') # 解析JSON data_json = json.loads(data_str) # 提取需要的字段(根据接口返回的实际字段名调整) # 假设接口返回的JSON结构类似 {"N": "传感器名称", "V": 5.2, "U": "V"} sensor_name = data_json.get("N") voltage_value = data_json.get("V") unit = data_json.get("U") print(f"名称: {sensor_name}, 电压: {voltage_value}{unit}") # 模拟前端200ms的请求间隔 time.sleep(0.2) except Exception as e: print(f"请求或解析出错: {e}") time.sleep(1) # 出错后延迟1秒再重试
更简洁的requests版本(需先安装:pip install requests)
如果你愿意用更易用的库,requests会比urllib更简洁:
import requests import time while True: try: # 发送GET请求到readVal接口 res = requests.get("http://192.168.4.1/readVal") res.raise_for_status() # 检查请求是否成功 data_json = res.json() # 直接解析JSON # 提取数据 sensor_name = data_json["N"] voltage_value = data_json["V"] unit = data_json["U"] print(f"名称: {sensor_name}, 电压: {voltage_value}{unit}") time.sleep(0.2) except Exception as e: print(f"出错: {e}") time.sleep(1)
注意事项
- 如果
readVal接口不是GET请求(比如是POST),需要查看前端JS里的请求方式,调整代码中的请求方法。 - 确保树莓派和设备在同一WiFi网络下,能正常访问
192.168.4.1。 - 如果接口返回的JSON字段名不是N、V、U,可以先打印
data_json查看完整结构,再调整提取的字段名。
内容的提问来源于stack exchange,提问作者Rallysteve
相关产品推荐
相关产品推荐

