You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:25:24