基于BeautifulSoup爬取电价表格并实现与基荷电价的对比问题
解决方案
问题分析
你的代码在遍历小时电价表格行时,每次循环都会生成并打印一个独立的单元素列表,导致最终输出24个独立列表。要实现电价对比,需要:
- 将分散的小时电价收集到单个列表中
- 将字符串格式的电价转换为数值类型(如浮点数),以便进行大小比较
- 确保基荷电价也转换为数值类型
修改后的代码
import datetime import pytz import requests from bs4 import BeautifulSoup as bs # 时区与日期处理 today_utc = pytz.utc.localize(datetime.datetime.utcnow()) today = today_utc.astimezone(pytz.timezone("Europe/Amsterdam")) text_today = today.strftime("%y-%m-%d") yesterday = datetime.datetime.now(tz=pytz.timezone("Europe/Amsterdam")) - datetime.timedelta(1) text_yesterday = yesterday.strftime("%y-%m-%d") # 构造请求URL url_part1 = 'https://www.epexspot.com/en/market-data?market_area=NL&trading_date=' url_part2 = '&delivery_date=' url_part3 = '&underlying_year=&modality=Auction&sub_modality=DayAhead&technology=&product=60&data_mode=table&period=&production_period=' url_text = url_part1 + text_yesterday + url_part2 + text_today + url_part3 # 获取网页内容并解析 html_text = requests.get(url_text).text soup = bs(html_text, 'lxml') # 获取并转换基荷电价为浮点数 baseload = soup.find('div', class_='flex day-1') # 用find而非find_all,确保只取第一个匹配项 baseload_price = float(baseload.find('span').text.replace(' ', '')) print(f"基荷电价: {baseload_price}") # 收集小时电价到单个列表并转换为浮点数 hourly_prices = [] table_rows = soup.find_all('tr', {'class':'child'}) for row in table_rows: # 提取第4列的内容(对应电价),每个行仅含一个电价值 price_text = row.find_all('td')[3].text.strip() hourly_price = float(price_text) hourly_prices.append(hourly_price) print(f"小时电价列表: {hourly_prices}") print(f"小时电价数量: {len(hourly_prices)}") # 正常输出应为24 # 对比电价并输出需要触发设备的时段 print("\n需要开启设备的时段(小时):") for hour_idx, price in enumerate(hourly_prices, start=1): if price <= baseload_price: print(f"第{hour_idx}小时 (电价: {price})") # --- 此处添加MQTT触发逻辑 --- # 示例:如果满足条件,发送MQTT消息 # import paho.mqtt.client as mqtt # client = mqtt.Client() # client.connect("your-mqtt-broker-ip", 1883, 60) # if price <= baseload_price: # client.publish("home/automation/device/trigger", "ON") # client.disconnect()
关键修改点
- 基荷电价:将
find_all改为find,确保只获取单个基荷价格,并转换为浮点数以便计算 - 小时电价:创建
hourly_prices空列表,在循环中逐个提取电价字符串并转换为浮点数,统一收集到列表中 - 对比逻辑:使用
enumerate遍历小时电价列表,同时获取时段序号(1-24),直接判断是否满足触发条件
后续扩展
你可以在电价对比逻辑后,加入MQTT客户端代码(已给出示例注释),当小时电价低于等于基荷电价时,向指定主题发送触发消息,实现家庭自动化设备的控制。
内容的提问来源于stack exchange,提问作者Antony
相关产品推荐
相关产品推荐

