Tutorial: Website parsen mit dem ESP8266 – Teil 1
Einleitung
In den letzten Tagen habe ich mich verstärkt mit der Abfrage verschiedener Websites beschäftigt und der Nutzung der Informationen im eigenen Programm. Das Finden und Extrahieren von Informationen aus einem Text, einem String oder einer Seite nennt man parsen. Da ich dabei viel gelernt habe, möchte ich dieses Wissen gerne weitergeben. Wichtig ist mir dabei wie immer, dass ihr das versteht und selbstständig nachvollziehen könnt. Deshalb werden meine Erklärungen vielleicht etwas ausführlicher und richten sich an die Programmieranfänger unter euch. Da ich das Tutorial für den ESP schreibe, werde ich auch auch auf die grundsätzliche Abfrage von Websites mit dem ESP eingehen.
Der ESP als Client
In den Libraries des ESP ist ein Beispiel enthalten, wie mit den ESP als Client Informationen von einem Webserver abgerufen werden können. In meinem Tutorial über die Speicherung von MySQL Daten habe ich ja bereits ein Beispiel zur Abfrage eines Webservers gezeigt. Das folgende Beispiel zeigt die Anwendung des ESP als Client mit Nutzung der neuesten Libraries. Das Beispiel ruft google.de auf und schreibt die Ausgabe auf die serielle Schnittstelle.
/* * Basic ESP Client example, based on the ESP libraries examples */ #include <ESP8266WiFi.h> const char* ssid = "yourSSID"; const char* password = "yourPASSPHRASE"; const char* host = "google.de"; void setup() { Serial.begin(115200); delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); Serial.println(); } void loop() { Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request String url = "/"; Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); // start waiting for the response unsigned long lasttime = millis(); while (!client.available() && millis() - lasttime < 1000) {delay(1);} // wait max 1s for data // Read all the lines of the reply from server and print them to Serial while(client.available()){ char readchar = client.read(); Serial.print(readchar); } Serial.println(); Serial.println("closing connection"); delay(5000); }
Auf einige Teile dieses Codes möchte ich nochmal tiefer eingehen.
// We start by connecting to a WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Im setup wird die Verbindung zum lokalen WLAN aufgebaut, dazu müssen im Parameterblock oben im Programm SSID und Passwort eingetragen werden.
Das Programm versucht nun (hier endlos) eine Verbindung zum WLAN aufzubauen. In meinem Fall wird die Verbindung nach ca. 5-8 Sekunden aufgebaut, wenn es bis dahin keine Verbindung gibt, muss man ein Reset machen und manchmal auch den Code neu flashen.
WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; }
Im loop wird dann die Verbindung zum Host, hier google.de aufgebaut
// We now create a URI for the request String url = "/"; Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
Zunächst wird die URL für die Abfrage zusammengesetzt. Als erstes wird der Teil der nach dem Host in der URL kommt in einen String geschrieben. In diesem Fall kommt nach google.de nichts mehr, deshalb steht hier nur ein „/“. Im nchsten Schritt werden die für die Abfrage notwendigen Parameter zum String hinzugefügt. ( die \r\n stehen für CR und LF und müssen an diesen Stellen stehen, am Ende der Abfrage sogar zweimal). Die client.print() Anweisung schickt die Abfrage zum Server.
// start waiting for the response unsigned long lasttime = millis(); while (!client.available() && millis() - lasttime < 1000) {delay(1);} // wait max 1s for data
Jetzt wartet der Client auf eine Antwort des Servers. Manche Server lassen sich damit Zeit, deshalb wartet der Client entweder bis er Daten bekommt (client-available()=true) oder die Zeit abgelaufen ist (hier 1000ms).
while(client.available()){ char readchar = client.read(); Serial.print(readchar); }
Solange Daten empfangen werden, gibt der ESP diese Buchstabe für Buchstabe auf der seriellen Schnittstelle aus. Im Client der Library ist hier alternativ eine Methode vorgeschlagen, die Daten zeilenweise (bis zum CR) zu lesen und auszugeben. Diese Methode werden wir für die nächsten Beispiele verwenden, also jetzt schon mal in das Beispiel einbauen. Manchmal ist es sinnvoller, statt nach einem CR ein LF zu suchen, dann sind die Strings möglicherweise kürzer, doch dazu später mehr.
// Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); }
Die Aussgabe auf der seriellen Schnittstelle sieht dann so aus
Connecting to DD-WRT ............. WiFi connected IP address: 192.168.2.109 connecting to google.de Requesting URL: / HTTP/1.1 301 Moved Permanently Location: http://www.google.de/ Content-Type: text/html; charset=UTF-8 Date: Sat, 30 Jan 2016 22:25:54 GMT Expires: Mon, 29 Feb 2016 22:25:54 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 218 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Connection: close <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.de/">here</A>. </BODY></HTML> closing connection
Am Anfang der Ausgabe kommen Informationen über den Server, die eigentliche Ausgabe der Webseite beginnt ab <HTML>. Die Webseite bietet nicht viel an nutzbarer Information, allerdings könnte man aus den Header Daten die Uhrzeit parsen, anstatt den NTP Client einzubinden. Das möchte ich als abschließendes erstes Beispiel für das parsen zeigen. Wichtig beim parsen ist, dass man ein sich eindeutige Suchbegriffe sucht, über die man die Zeile in der die Information steht und als zweites der Platz in der Zeile eindeutig bestimmen kann. Für die Zeitabfrage ist das die Zeile
Date: Sat, 30 Jan 2016 22:25:54 GMT
Als erstes suchen wir also im eingelesenen String nach dem Suchwort „Date“ und wissen dann, dass wir in der richtigen Zeile sind. Das Schöne an diesem Beispiel ist, dass die Zeit immer genau an der selben Stelle im String steht.
Die beiden wichtigsten Befehle beim parsen sind:
String.indexOf(„Suchstring“) -> gibt als int die Position im String aus, wo der Suchstring gefunden wird
String.substring(von, bis) -> liefert String, der bei „von“ beginnt und vor „bis“ endet.
Da wir wissen, dass das Suchwort „Date“ immer an Position 1 im String zu finden ist (auf Position 0 steht ein LF), können wir einfach die Position im String abzählen, wo der gesuchte Teil steht. Doch zuvor testen wir, ob der Suchstring im gelesenen String vorkommt.
_________1_________2_________3_________4
1234567890123456789012345678901234567890
Date: Sat, 30 Jan 2016 22:25:54 GMT
Der entsprechende Code-Block sieht dann so aus:
while (client.available()) { String line = client.readStringUntil('\r'); if (line.indexOf("Date:")>=0) { // Searchstring exists? Serial.println(); Serial.print("Heute ist der "); Serial.print(line.substring(12, 23)); Serial.print(", es ist "); Serial.println(line.substring(24, 32)); } Serial.print(line); }
Die Uhrzeit wird in GMT ausgegeben, zur korrekten Darstellung muss (in der Winterzeit) 1 Stunde addiert werden. Dafür müssen Teile des Strings zunächst mit dem Befehl atoi() in einen Integer umgewandelt werden. Dieser Befehl kann nicht direkt auf den String ausgeführt werden. Dafür wird zunächste der Teilstring extrahiert und an die Funktion atoi() der Pointer auf den neuen String übergeben. Dafür setzen wir die Funktion String.c_str() ein.
while (client.available()) { String line = client.readStringUntil('\r'); if (line.indexOf("Date:")>=1) { // Searchstring exists? Serial.println(); Serial.print("Heute ist der "); Serial.print(line.substring(12, 23)); String stundeSubString = line.substring(24,26); int stunde = atoi(stundeSubString.c_str()); if (stunde==23) stunde=0; else stunde++; Serial.print(", es ist "); if (stunde<10) Serial.print("0"); Serial.print(stunde); Serial.print(line.substring(26, 32)); if (stunde==0) Serial.print(" + 1 Tag"); else Serial.println(); // Tagsprung ?? }
Natürlich müsste bei einem Tagsprung, also bei 0 Uhr bis 0:59 auch der Tag geändert werden. Das ist eine nette Übung für euch. Man sieht, mit der Umwandlung der Ausgabe in rechenbares Format, kann der Code schnell umfangreicher werden.
Die Ausgabe sieht jetzt so aus:
Connecting to DD-WRT ............. WiFi connected IP address: 192.168.2.109 connecting to google.de Requesting URL: / HTTP/1.1 301 Moved Permanently Location: http://www.google.de/ Content-Type: text/html; charset=UTF-8 Heute ist der 31 Jan 2016, es ist 08:33:24 Date: Sun, 31 Jan 2016 07:33:24 GMT Expires: Tue, 01 Mar 2016 07:33:24 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 218 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Connection: close <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.de/">here</A>. </BODY></HTML> closing connection
Die war der erste Teil meines Tutorials zum parsen von Webseiten. Ich hoffe, ihr konntet meinen Erklärungen folgen und die Beispiele funktionierten auch bei euch. Wie immer, freue ich mich auf eure Rückmeldungen. Im zweiten Teil werde ich euch weitere Tips geben, wie eine Webseite „auseinander genommen“ werden kann.
Anmerkung: google.de gibt dem ESP nur eine sehr reduzierte Information zurück. Offensichtlich erkennt google, dass hier kein Browser anfragt.
Veröffentlicht am 31. Januar 2016 in ESP8266, Tutorial und mit Arduino, ESP, ESP8266, Tutorial, Webserver getaggt. Setze ein Lesezeichen auf den Permalink. 21 Kommentare.
Hallo trotzdem noch eine Frage: Die Anordnung der Blocks sind für mich beim letzten beschriebenen Beispiel nicht ganz ersichtlich. Wo sollte der Block mit dem Datum eingebunden werden? Hättest du vielleicht den entsprechenden Code noch zur Hand.
Hallo Chilla,
der gesamte Code steht im Post oben, du musst nur den Bereich
„click here to expand the code of the ESP Client example“
aufklappen.
Dann musst du nur noch den Block
while(client.available()){
char readchar = client.read();
Serial.print(readchar);
}
durch den letzten Block im Post ersetzen.
Gruß
Reinhard
(ich hoffe, ich habe dich richtig verstanden)
danke. Klasse erklärt . Hab es geschaft dank Ihrer Erkärung ein Projekt zu lösen.
Auf der Seite http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/objekteinbindung.html
des deutschen Wetterdienstes werden Wetterwarnungen als html und json files angeboten.
http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json
http://www.dwd.de/DWD/warnungen/warnapp_gemeinden/json/warnings_gemeinde_baw.html
Obwohl ich mich eng an das Beispielprogramm gehalten habe bekomme ich keine Daten vom Server.
Was mache ich falsch? WLAN access klappt, auch die Verbindung zum Server wird aufgebaut.
————————–schnipp—————————————————–
#include
#include
WiFiClient client;
const char* ssid = „****“;
const char* password = „****“;
const char* host = „www.dwd.de“; // DWD server
const int http_port = 80;
// different server requests
const char* Server_BW = „/DWD/warnungen/warnapp_gemeinden/json/warnings_gemeinde_baw.html“;
const char* Server_json = „http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json“;
char InChar; // incomming characters
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println(); Serial.println(„sketch_jul17d“);Serial.println(); Serial.println();
delay(1000);
// We start by connecting to a WiFi network
Serial.print(„Connecting to „);
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(„.“);
}
Serial.println();
Serial.println(„WiFi connected“);
Serial.println(„IP address: „);
Serial.println(WiFi.localIP());
Serial.println();
}
void loop() {
Serial.println(„connecting DWD server“);
while(!client.connect(host, http_port)){ // wait for server connection
Serial.println(„no server connection „);
delay(1000);
}
Serial.println(„server connection established“); // ok, start request
client.println(String(„GET „) + Server_json + “ \r\n“);
// + „Host: “ + host + „\r\n“ +“Connection: close\r\n\r\n“); // verstehe ich nicht
// start waiting for the response
unsigned long lasttime = millis();
while (!client.available() && millis() – lasttime < 5000) {delay(1);} // wait max 5s for response
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
InChar = client.read();
Serial.print(InChar);
}
Serial.println();
client.stop(); // Close socket
delay(10000); // start over again
}
——————————-schnapp——————————
Hallo Jochen,
es sind nur ein paar Tipp- oder Kopierfehler im Code gewesen. Hier die Zeilen die ich geändert habe:
#include
WiFiClient client;
const char* ssid = „****“;
const char* password = „****“;
….
const char* Server_json = „/DWD/warnungen/warnapp/json/warnings.json“;
….
Serial.println(„server connection established“); // ok, start request
client.println(String(„GET „) + Server_json + “ HTTP/1.1\r\n“ + „Host: “ + host + „\r\n“ +“Connection: close\r\n\r\n“); // könnte man auch noch einfacher schreiben
// start waiting for the response
….
Schönen Gruß aus Köln und weiter so
Reinhard
2. Versuch
mein etwas längeren Kommentar in dem ich mich für die sehr hilfreichen Hinweise und die nette Artdies zu tun bedanke ist leider nicht gesendet worden (access Google account)
Hi Reinhard,
Deinem Rat „weiter so“ bin ich gefolgt und schwupp brauche ich nochmals Deine Hilfe.
Der deutsche Wetter Dienst (DWD) bietet online eine Fülle von Services, u.a. auch Wetterwarnungen in verschiedenen Formaten (http, JSON), die ich verarbeiten möchte. Hier eine Übersicht:
http://www.dwd.de/DE/wetter/warnungen_aktuell/objekt_einbindung/einbindung_karten_geowebservice.pdf?__blob=publicationFile&v=2Mit der URL bekommt man Gemeinde spezifische JSON Daten :
https://maps.dwd.de/geoserver/dwd/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=dwd:Warnungen_Gemeinden&maxFeatures=50&outputFormat=text%2Fjavascript&CQL_FILTER=WARNCELLID%20IN%20('808435059‚)
Im Browser eingegeben funktioniert das prima. Diese URL, wegen der Sonderzeichen (Seite 4 der Übersicht) etwas modifiziert, in einem GET-Aufruf funktioniert – zumindest bei mir – leider nicht. Was mache ich falsch, hat jemand einen Tipp für mich?
Besten Dank und ein schönes Wochenende
———————schnipp———————
/*
* DWD Wetterwarnungen V3
*/
#include
#include
WiFiClient client;
const char* ssid = „###“;
const char* password = „###“;
const char http_site[] = „maps.dwd.de“; // DWD Server
const int http_port = 80;
const char* service_1 = „/DWD/warnungen/warnapp_gemeinden/json/warnings_gemeinde_baw.html“; // DWD services
const char* service_2 = „/DWD/warnungen/warnapp/json/warnings.json“;
char InChar; // incomming characters
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println(); Serial.println(„ESP_DWD_V3“);Serial.println(); Serial.println();
delay(1000);
Serial.print(„Connecting to „); // connect to WiFi…
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(„.“);
}
Serial.println();
Serial.println(„WiFi connected“);
Serial.println(„IP address: „);
Serial.println(WiFi.localIP());
Serial.println(); // established!
}
void loop() {
Serial.println(„connecting DWD server“);
while(!client.connect(http_site, http_port)){ // wait for server connection
Serial.println(„no server connection „);
delay(1000);
}
Serial.println(„server connection established“); // ok, make a HTTP GET request
client.print(String(„GET „) +
„%2Fgeoserver%2Fdwd%2Fows%3Fservice%3DWFS%26version%3D1.0.0%26request%3DGetFeature%26typeName%3Ddwd%3AWarnungen%5FGemeinden%26maxFeatures%3D50%26outputFormat%3Dtext%2Fjavascript%26CQL%5FFILTER%3DWARNCELLID%20IN%20%28%27809362000%27%29%20%5Cr%%Cn“ +
“ HTTP/1.1\r\nHost: “ + http_site +
„\r\nConnection: close\r\n\r\n“ );
unsigned long lasttime = millis(); // server might need some time…
while (!client.available() && millis() – lasttime < 5000) {delay(1);} // …to response
while(client.available()){
InChar = client.read();
Serial.print(InChar);
}
Serial.println();
client.stop(); // Close socket and …
delay(10000); // …start over again
}
——————schnapp——————–
das ist eine Zeile:
client.println(String(„GET „) + Server_json + “ HTTP/1.1\r\n“ + „Host: “ + host + „\r\n“ +“Connection: close\r\n\r\n“); // könnte man auch noch einfacher schreiben
Hi,
tolles Tutorial. Hab damit mein Problem umgangen, nicht direkt auf eine DB zugreifen zu können. Somit parse ich mir ein PHP-Script welches mir die Daten mit speziellen Trennzeichen ausgibt. Nach etwas gefummel hat es dann funktioniert. Habe dann festgestellt, dass eine int-Variable doch besser ist als eine byte-Variable. Nachdem die zu übergebenden Daten immer mehr wurden, ist mir die Variable „überlaufen“. Hab mehrere Tage nach dem „Fehler“ gesucht. PEBKAC :-)
Jetzt hab ich nur noch einen Schönheitsfehler: Die Abfrage dauert doch relativ lange (4-5 Sekunden). Kann man das irgendwie beschleunigen?
Wenn ich das Script per Browser aufrufe, dann ist das Ergebnis sofort da. Der ESP gibt auch sofort die Serverdaten und die Länge der Datenmenge aus. Die Daten an sich gibt er aber erst nach den 4-5 Sekunden aus. In dieser Zeit kann das Programm aber nicht auf Buttons o.ä. reagieren.
Kann ich über das PHP-Script irgend einen Wert übergeben, der dem ESP sagt, dass alles da ist?
Hier mal ein Teil vom Sketch:
———————————————————————-
client.print(String(„GET „) + url + “ HTTP/1.1\r\n“ +
„Host: “ + host + „\r\n“ +
„Connection: close\r\n\r\n“);
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() – timeout > 1000) {
Serial.println(„>>> Client Timeout !“);
client.stop();
return;
}
}
String line;
// Read all the lines of the reply from server and print them to Serial
while(client.available()) {
line = client.readStringUntil(‚\r‘);
Serial.print(line);
———————————————————————-
Und die Ausgabe auf dem seriellen Monitor:
———————————————————————-
Connecting to FreeWiFi
…..
WiFi connected
IP address:
192.168.254.44
connecting to maier-illertal.de
Requesting URL: /bestelldruck.php?status=1
HTTP/1.1 200 OK
Date: Thu, 19 Jul 2018 16:21:08 GMT
Server: Apache
X-Powered-By: PHP/7.0.30
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
X-Varnish: 666021275
Age: 0
Via: 1.1 varnish (Varnish/6.0)
Accept-Ranges: bytes
Content-Length: 54
Connection: close
a0;a1;a2;a3;a4;a5;a6;a7;a8;a9;a10;a11;a12;a13;a14;a15;
———————————————————————-
Zur Erleichterung: Die Auszugebenden Zahlen sind immer durch a0; a1; etc getrennt.
Nachtrag: Es wurden keine Daten ausgegeben, da die Datenbank gerade leer ist. Drum sind nur die Platzhalter ausgegeben worden :-)
Es dauert aber gleichlange, egal ob Daten vorhanden sind, oder nicht.
Es scheint an dem Befehl
line = client.readStringUntil(‚\r‘);
zu liegen. Der wartet bis er ins Timeout läuft, weil zwar Daten da sind zum lesen, er aber kein „\r“ mehr findet.
bau den Teil zum auslesen mal so auf:
// Read all the lines of the reply from server and print them to Serial
while (client.available()) {
char text = client.read();
Serial.print(text);
}
Serial.println();
Serial.println(„closing connection“);
Hey,
danke mal. Hätte ich wohl selbst draufkommen können… Steht ja schließlich im Tutorial.
Es wird wohl am Timeout liegen, da es mit der anderen Methode viel schneller geht.
Wenn ich line = client.readString(); nehme, dann geht es auch schneller, aber bei weitem nicht so, wie mit dem Char-Array.
Vielen Dank!
„google.de gibt dem ESP nur eine sehr reduzierte Information zurück. Offensichtlich erkennt google, dass hier kein Browser anfragt.“
Knapp vorbei… Im Header fehlt die Zeile „Request URL: http://www.google.de/„. Deshalb geht der Server davon aus, dass die IP von einem google-Server als URL eingegeben wurde. Deshalb kommt ein 301 Redirect zurück. Dieser soll den Client darauf hinweisen, bitte „http://www.google.de/“ aufzurufen (mir passendem Header). Danach käme dann noch ein zweiter Redirect, mit dem man auf https://www.google.de geleitet wird.
Insofern ist Google egal, wer anfragt. Es wird einfach davon ausgegangen, dass jemand direkt die IP aufgerufen hat.
Danke für den Hinweis, muss ich direkt mal ausprobieren
Wieso sollte die Request-URL fehlen? Es wird ein GET / geschickt und als Host wird google.de genannt. Damit ist die Request-URL bekannt: http://google.de/
Der Webserver geht also nicht davon aus, dass über die IP-Adresse aufgerufen wurde. Der Server geht davon aus, dass google.de aufgerufen wurde. (Übrigens: Würde der Server davon ausgehen, dass man über die IP-Adresse aufruft, würde er nicht auf http://www.google.de sondern auf http://www.google.com weiterleiten)
Das Problem ist, dass Google sich entschieden hat, die Website nicht über google.de sondern über http://www.google.de/ auszuliefern. Das ist zwar ein schlechter Stil (siehe no-www.org ), aber eine Entscheidung, die man treffen kann. Daher erfolgt dann auch die Weiterleitung auf http://www.google.de/ .
Ich habe es mit curl ausprobiert. Ich sah (zumindest im Header) keine Weiterleitung zu https. Eventuell findet die Weiterleitung durch JavaScript statt.
Vielen Dank für deine Recherche und Erklärungen
Danke für das nette Tutorial!
Hallo,
ich finde deine Erklärung klasse!
Gibt es auch eine Möglichkeit nach einem Text zu suchen und dann die darauffolgenden Zeichen auszugeben?
Ich habe mal ein Beispiel einer kleinen Webseite auf Wemos die mir die Informationen Zeilenweise ausgibt:
WeMoS 1 Pelletlager
WeMoS 71 Pelletlager
Entfernung
134 cm
Temperatur
13.81 C
Temperatur intern
19.94 C
Luftfeuchte
45.83%
Luftdruck
992.50 hp
Wenn ich hier z.B. den Wert „13.81“ herausholen möchte. Wie muss ich das machen?
Prinzipiell ja.
Du suchst nach dem ersten Vorkommen von „Temperatur“ und du suchst nach dieser Position nach dem ersten Vorkommen von „C“. Zwischen diesen beiden Positionen steht der Wert, du musst nur noch die Zeilenumbrüche berücksichtigen.
Wenn das zeilenweise ausgegeben wird, genauso. Du suchst nach dem ersten Vorkommen „Temperatur“ dann weisst du, dass in der nächsten Zeile der Wert kommt.
Hallo,
Wenn ich in meiner URL z.b http://www.google.de/katze/ habe wie wird das in dem Quelltext angegeben?
statt
String url = „/“;
müsste es
String url = „/katze/“;
heißen