【发布时间】:2019-02-06 10:40:09
【问题描述】:
首先我是 python 和 beautifulsoup 的新手。
我无权访问在 html 代码中链接的 css、js 文件。我也无法修改 html 页面。
我在 linux 上,并且正在使用 python3,如果这很重要的话。
我有以下页面:https://pastebin.com/VqRRe02P
托管的实际 html 代码未格式化,我通过在线 html 代码格式化程序运行代码。因此,我将在下面说明的行不会 100% 正确。
这是我目前正在使用的代码(并非所有功能都已实现):
import requests
import csv
from bs4 import BeautifulSoup, element
from operator import itemgetter
# ermöglicht schnelles Wechseln des Hosts (IP über die, das Interface lokal erreichbar ist)
a = 'http://192.168.68.128' # IP der Wärmepumpe
b = 'http://localhost' # für Entwicklungszwecke
# beziehe Daten vom Host
data = requests.get(b)
# lade Daten in BeautifulSoup
soup = BeautifulSoup(data.text, 'html.parser')
# Liste 'data' wird erstellt
data = []
var_name = []
# Alle Tabellen werden gesucht und in die Variable 'row' gespeichert
for tr in soup.table.find_all('tr'):
row = [td.text for td in tr.find_all('td')]
var_name.append(row[0])
if not row[1].startswith('\n') and row[2] in ['°C', 'bar']: # hier werden Filter angewendet, um nur relevante Daten zu speichern
data.append(itemgetter(1)(row)) # die gefilterten Daten werden in die Liste 'data' gespeichert
print(var_name[2])
# die Strings von 'data' werden in den Datentyp float umgewandelt
data = list(map(float, data))
# hier werden die Unter- und Obergrenze festgelegt
min_value = 0
max_value = 100
# Funktion überprüft, ob ein Wert die Untergrenze überschreitet
def check1():
if data[1] < min_value:
return(1)
else:
return(0)
# Funktion überprüft, ob ein Wert die Obergrenze überschreitet
def check2():
if data[1] > max_value:
return(1)
else:
return(0)
# Funktion überprüft, ob ein Fehler vorliegt
def check():
if check1() + check2() is 2:
return('Fehlercode: 2')
if check1() + check2() is 1:
return('Fehlercode: 1')
else:
return('OK')
if check() in 'Fehlercode: 2':
print('Email mit Fehlercode 2 senden') # Platzhalter für Email Skript ausführen
if check() in 'Fehlercode: 1':
print('Email mit Fehlercode 1 senden') # Platzhalter für Email Skript ausführen
# Daten werden in eine CSV Datei namens 'auslesen.csv' gespeichert
with open('auslesen.csv', 'w') as auslesen:
writer = csv.writer(auslesen)
writer.writerow(data)
auslesen.close()
/* 我需要从以下行中的 td 元素中读取数据并将它们保存到变量中,然后将它们输出到文本文件中,例如“var1、var2、var3、..”。 这些线路是 158、204、264、339、557、579、920、937、954、1023、1042、1114、1168。 */
我现在可以检查列表数据的元素是否超过了最小值或最大值。
问题不在于所有值都以度(°C)为单位,有些以压力(bar)为单位,因此我还需要获取 bar 的最小值或最大值。我该怎么做?
而且我还想弄清楚哪个值完全超过了最小值或最大值,并包括它的名称和度数或条形(名称在列表 var_name 中找到,但索引不一样,因为列表行/数据中的一些数据获取过滤。还尝试删除 document.write(); 以仅使用 .text.strip() 获取实际名称不起作用。
不过需要过滤,否则我无法将字符串转换为浮点数。
例如,如果我们说“Aussentemperatur”(html 代码第 158 行)是 200.0 而不是 1.4,则希望输出到 csv 文件中的是:
Aussentemperatur, 200, °C
如果有更多的值超出,请保持输出。
由于我不知道盐水热泵的行为如何,因此在构建 html 页面时,我希望它会写一些字符串。在这种情况下,我还想输出给定的字符串:
Aussentemperatur, unknownstring, °C
编辑:我将代码编辑为当前状态并添加了一个新段落
【问题讨论】:
-
如果线条不一定准确,也许提供预期值? html中有很多错误。这是从源代码完全复制(格式化除外)吗?上面的 td 元素集合会发生什么?
-
是的,这是完全复制的(除了我提到的格式)。期望值是动态的,而不是静态的。这是来自公司dimplex的盐水热泵。您可以检查它的网络界面上的值(我链接的 html 代码)。我想用 python 读取这些值。
-
你上面的代码有什么问题?
-
它输出所有 td 元素,而我只想要特定行中 td 元素的值。例如,第 158 行中的第一个值是 1.4(摄氏度),这个值一直在变化,因为我们想随时知道准确的温度
-
我不认为 bs4 支持像 nth-of-type 这样的伪选择器,因为我会使用它来按数字定位行。您能否在循环中使用计数器来代替适当的 trs。
标签: javascript python html web-scraping beautifulsoup