如何提取网页中由JavaScript动态生成而非静态HTML内置的温度数值
ControlByWeb温度传感器数值提取方案
方案1:直接调用设备原生API(优先推荐)
ControlByWeb全系列设备默认自带结构化状态查询接口,不需要解析前端渲染的页面,是最适合家庭自动化轮询的轻量方案:
- 设备默认状态接口地址为
/state.xml,你可以直接请求http://<设备IP地址>/state.xml获取包含温度在内的所有设备状态数据,返回的XML格式内容中可直接找到三个温度对应的标签字段,你提到的演示设备直接访问http://107.1.170.22:9036/state.xml即可验证数据。 - 适配Python 2.7的示例代码如下,无需安装额外第三方依赖:
import urllib2 import xml.etree.ElementTree as ET # 替换为你实际的设备接口地址 device_url = "http://107.1.170.22:9036/state.xml" response = urllib2.urlopen(device_url) xml_content = response.read() root = ET.fromstring(xml_content) # 标签名可根据实际返回的XML调整,演示设备对应温度标签为temp1、temp2、temp3 temp_1 = root.find("temp1").text temp_2 = root.find("temp2").text temp_3 = root.find("temp3").text print("三个温度分别为:%s、%s、%s" % (temp_1, temp_2, temp_3))
方案2:渲染前端JS获取数值(备选)
如果你的设备型号特殊没有公开状态接口,再使用渲染JS的方式获取页面最终内容,Python 2.7环境下可使用Selenium+PhantomJS实现:
- 先安装适配Python 2.7的Selenium版本,再下载PhantomJS二进制文件放到系统PATH路径下
- 示例代码如下:
from selenium import webdriver driver = webdriver.PhantomJS() # 替换为你的设备页面地址 driver.get("http://107.1.170.22:9036/") # 等待JS渲染完成 driver.implicitly_wait(3) # 选择器可通过浏览器F12元素检查功能获取对应温度元素的id/class属性 temp_1 = driver.find_element_by_css_selector("#temp1").text temp_2 = driver.find_element_by_css_selector("#temp2").text temp_3 = driver.find_element_by_css_selector("#temp3").text driver.quit() print(temp_1, temp_2, temp_3)
注意事项
Python 2.7已经停止官方维护,后续如果有条件建议升级到Python 3版本,依赖安装、运行效率和安全性都会有明显提升。
内容的提问来源于stack exchange,提问作者Mark G
相关产品推荐
相关产品推荐

