Вы можете решить, какие из ваших строк включить, основываясь на том, правильно ли это отформатированная запись, содержащая запись либо °C
, либо bar
.Тип датчика можно извлечь из текста сценария с помощью регулярного выражения.
from collections import defaultdict
from bs4 import BeautifulSoup
import csv
import re
with open('index.html') as f_html:
html = f_html.read()
soup = BeautifulSoup(html, "html.parser")
readings = defaultdict(list) # Hold per sensor readings in a dictionary
with open('output.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['Sensor', 'Value', 'Unit'])
for tr in soup.table.find_all('tr'):
row = [td.text for td in tr.find_all('td')]
if not row[1].startswith('\n') and row[2] in ['°C', 'bar']:
sensor = re.search(r'\((.*?)\)', row[0]).group(1) # Extract sensor name from script text
value = float(row[1])
unit = row[2]
readings[sensor].append(value)
csv_output.writerow([sensor, value, unit])
for sensor in sorted(readings):
data = readings[sensor]
print(f'{sensor}:\n Min {min(data)}, Max {max(data)}, {data}')
Библиотека Python CSV может использоваться для простой записи строк данных, правильно отформатированных в файл.
Это даст вам CSV-файл, обобщенный следующим образом:
Sensor,Value,Unit
Aussentemperatur,1.4,°C
Vorlauftemperatur,28.0,°C
Vorlauftemperatur,28.0,°C
Vorlauftemperatur,27.1,°C
Vorlauftemperatur,28.0,°C
Vorlauftemperatur,0.0,°C
Ruecklauftemperatur,27.1,°C
Ruecklauftemperatur,27.1,°C
Ruecklauftemperatur,28.0,°C
Ruecklauftemperatur,27.1,°C
Ruecklaufsolltemperatur,18.0,°C
Temperatur,0.0,°C
Kollektortemperatur,28.3,°C
MiniTempGKZwei,0.0,°C
Temperatur,16.3,°C
Temperatur,-999.9,°C
Solltemperatur,25.8,°C
MiniTempGKDrei,0.0,°C
Temperatur,35.1,°C
Temperatur,28.3,°C
Temperatur,0.0,°C
Solltemperatur,25.8,°C
Abtauendefuehler,17.6,°C
TempSpeicherReg,35.1,°C
TempSpeicherReg,28.3,°C
TempSpeicherReg,0.0,°C
RLTempKp,0.0,°C
VlTempKp,0.0,°C
Heissgastemperatur,0.0,°C
Raumtemperatur,35.1,°C
Raumtemperatur,28.3,°C
Raumtemperatur,0.0,°C
Raumtemperatur,0.0,°C
Raumtemperatur,0.0,°C
Temperatur,41.6,°C
Warmwasser,45.0,°C
Temperatur,0.0,°C
Wuelleneintritt,16.3,°C
Wuellenaustritt,17.6,°C
Niederdrucksensor,9.6,bar
Vorlauftemperatur,0.0,°C
A defaultdict(list)
можно использовать для создания списков всех показаний датчиков для каждого датчика.Затем его можно использовать для отображения всех значений впоследствии, а также для отображения минимального и максимального значения, найденного для каждого датчика.Например, выходные данные будут такими:
Abtauendefuehler:
Min 17.6, Max 17.6, [17.6]
Aussentemperatur:
Min 1.4, Max 1.4, [1.4]
Heissgastemperatur:
Min 0.0, Max 0.0, [0.0]
Kollektortemperatur:
Min 28.3, Max 28.3, [28.3]
MiniTempGKDrei:
Min 0.0, Max 0.0, [0.0]
MiniTempGKZwei:
Min 0.0, Max 0.0, [0.0]
Niederdrucksensor:
Min 9.6, Max 9.6, [9.6]
RLTempKp:
Min 0.0, Max 0.0, [0.0]
Raumtemperatur:
Min 0.0, Max 35.1, [35.1, 28.3, 0.0, 0.0, 0.0]
Ruecklaufsolltemperatur:
Min 18.0, Max 18.0, [18.0]
Ruecklauftemperatur:
Min 27.1, Max 28.0, [27.1, 27.1, 28.0, 27.1]
Solltemperatur:
Min 25.8, Max 25.8, [25.8, 25.8]
TempSpeicherReg:
Min 0.0, Max 35.1, [35.1, 28.3, 0.0]
Temperatur:
Min -999.9, Max 41.6, [0.0, 16.3, -999.9, 35.1, 28.3, 0.0, 41.6, 0.0]
VlTempKp:
Min 0.0, Max 0.0, [0.0]
Vorlauftemperatur:
Min 0.0, Max 28.0, [28.0, 28.0, 27.1, 28.0, 0.0, 0.0]
Warmwasser:
Min 45.0, Max 45.0, [45.0]
Wuellenaustritt:
Min 17.6, Max 17.6, [17.6]
Wuelleneintritt:
Min 16.3, Max 16.3, [16.3]
Если посмотреть на этот вывод, это может означать, что вам может потребоваться отфильтровать минимальное и максимальное значения на основе значений для каждого датчика.
Если вы нене хотите обрабатывать значения вне диапазона 0-100
и затем использовать следующие строки:
if 0 <= value <= 100:
readings[sensor].append(value)
csv_output.writerow([sensor, value, unit])