Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Daten aus HTML-Code auslesen (RegEx,...) (https://www.delphipraxis.net/216659-daten-aus-html-code-auslesen-regex.html)

Helmi 6. Feb 2025 09:34

Daten aus HTML-Code auslesen (RegEx,...)
 
Hallo Zusammen,

ich bräuchte mal ein paar Ideen eurerseits.

Ich habe einen HTML-Text, in dem u. a. eine solche Tabelle abgebildet ist:
Code:
</header>
   
    <div class="container content-layout">
        <div class="row">
            <div class="col-md-2 left-layout-col">
                    <strong class="table-head">Günstigste Preise</strong>
    <table class="left-statistic">
        <thead>
            <tr>
                <th>Sorte</th>
                <th>Preis</th>
            </tr>
        </thead>

            <tr>
                <td>
                    Diesel
                </td>
                <td><a href="/tankstelle/bft-1696" rel="nofollow">1,529</a></td>
            </tr>
            <tr>
                <td>
                    Super E10
                </td>
                <td><a href="/tankstelle/esso-119" rel="nofollow">1,359</a></td>
            </tr>
            <tr>
                <td>
                    Super E5
                </td>
                <td><a href="/tankstelle/landwirtschaftliche-bezugsgenossenschaft-eg-2642" rel="nofollow">1,564</a></td>
            </tr>
    </table>
Ich möchte an die Namen (Diesel, Super E10, Super E5) und an die Preise darunter: <td><a href="/tankstelle/esso-119" rel="nofollow">1,359</a></td>

Ich tendiere jetzt zu RegEx, schon allein, weil ich es schon in dem Projekt verwende.
Aber hat jemand eine andere Idee, wie ich an die Werte kommen könnte?
Vielleicht gibt es ja auch noch was einfacheres?

AuronTLG 6. Feb 2025 09:42

AW: Daten aus HTML-Code auslesen (RegEx,...)
 
Wenn der Aufbau der HTML bekannt und verlässlich gleichbleibend ist, könnte man sie vielleicht als XML auslesen (IXMLDocument etc verwenden und den Text reinlesen). Ich bin mir nicht sicher, ob ich das schonmal gemacht habe, aber zumindest in der Theorie sollte das funktionieren.
Hätte den Vorteil, dass man es ordentlich automatisieren kann, anstatt mit RegEx herumfuchteln zu müssen.

Helmi 6. Feb 2025 09:49

AW: Daten aus HTML-Code auslesen (RegEx,...)
 
Zitat:

Zitat von AuronTLG (Beitrag 1545962)
Wenn der Aufbau der HTML bekannt und verlässlich gleichbleibend ist, könnte man sie vielleicht als XML auslesen (IXMLDocument etc verwenden und den Text reinlesen). Ich bin mir nicht sicher, ob ich das schonmal gemacht habe, aber zumindest in der Theorie sollte das funktionieren.
Hätte den Vorteil, dass man es ordentlich automatisieren kann, anstatt mit RegEx herumfuchteln zu müssen.

Ich möchte mich jetzt nicht darauf verlassen, dass der Aufbau gleichbleibend ist
Insgesamt wären es drei Tabellen.

Dein Vorschlag würde mir gut gefallen - wäre einfacher als RegEx und sollte man doch noch etwas parsen müssen, dann wäre der entsprechende Text kürzer

Delphi.Narium 6. Feb 2025 10:13

AW: Daten aus HTML-Code auslesen (RegEx,...)
 
Zuerst die Datei in eine Stringliste einlesen. Dann alle Zeilen von führenden und folgenden Leerzeichen befreien.

Dann die Datei in eine Stream schieben und diesen zeichenweise in einen zweiten Stream schreiben. Dabei vor allen < einen Zeilenumbruch schreiben und hinter jedem > ebenfalls einen Zeilenumbruch schreiben. Alle vorhandenen Zeilenumbrüche werden durch ein Leerzeichen ersetzt.

Das Ergebnis wieder in die Stringliste kopieren.

Dort hast Du dann alle Tags und Texte jeweils in einer eigenen Zeile.

Aus
HTML-Code:
            <tr>
                <td>
                    Diesel
                </td>
                <td><a href="/tankstelle/bft-1696" rel="nofollow">1,529</a></td>
            </tr>
wird dann
HTML-Code:
<tr>
<td>
Diesel
</td>
<td>
<a href="/tankstelle/bft-1696" rel="nofollow">
1,529
</a>
</td>
</tr>
Nun kannst Du am Anfang der Stringliste alle Zeilen bis einschließlich </thead> löschen.
Am Ende der Stringliste löschst Du alle Zeilen bis zum letzten </tr>.

Damit hast Du nun nur noch den Tabelleninhalt in der Stringliste.

Anschließend löschst Du alle Zeilen, die nicht mit einem < beginnen.
Die verbleibenden Zeilen befreist Du von führenden und folgenden Leerzeichen.
Leere Zeilen werden anschließend entfernt.

Übrig bleiben dann
Code:
Diesel
1,529
Super E10
1,359
Super E5
1,564
Lässt sich mit 'ner Reihe von For-Schleifen recht einfach und schnell realisieren.

Helmi 7. Feb 2025 19:27

AW: Daten aus HTML-Code auslesen (RegEx,...)
 
Hallo,
ich habe mich nun doch für RegEx entschieden, auch wenn es mit viel Fluchen verbunden war.
Zusätzlich konnte ich noch einen bereits vorhandenen RegEx anpassen.

Danke an eure Ideen.

jaenicke 7. Feb 2025 20:36

AW: Daten aus HTML-Code auslesen (RegEx,...)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Eine XSLT-Transformation ist auch eine Möglichkeit, die sehr übersichtlich und leicht anzupassen ist. Ein Beispielprojekt liegt anbei. Das Stylesheet kann hier leider nicht korrekt dargestellt werden, daher habe ich es wieder entfernt. Siehe Anhang.

Anhang 57388

Man kann auf die Weise auch eine Liste der Knoten holen usw., d.h. das ganze ist sehr flexibel.

Oder man holt sich nur die Knoten über ein Select:
Delphi-Quellcode:
var
  NodeList: IXMLDOMNodeList;
  Node: IXMLDOMNode;
...
    NodeList := HtmlDoc.selectNodes('//table[@class="left-statistic"]/tr');
    for i := 0 to NodeList.length - 1 do
    begin
      Node := NodeList.item[i];
      memResult.Lines.Add(IntToStr(i + 1) + ': ' + Node.xml);
    end;

Helmi 8. Feb 2025 08:28

AW: Daten aus HTML-Code auslesen (RegEx,...)
 
Zitat:

Zitat von jaenicke (Beitrag 1546062)
Eine XSLT-Transformation ist auch eine Möglichkeit, die sehr übersichtlich und leicht anzupassen ist. Ein Beispielprojekt liegt anbei. Das Stylesheet kann hier leider nicht korrekt dargestellt werden, daher habe ich es wieder entfernt. Siehe Anhang.

schaut interessant aus - das werde ich mir mal näher betrachten.

uligerhardt 8. Feb 2025 12:15

AW: Daten aus HTML-Code auslesen (RegEx,...)
 
Obligatory: https://stackoverflow.com/questions/...732454#1732454 ;-)

Christian Seehase 11. Feb 2025 19:27

AW: Daten aus HTML-Code auslesen (RegEx,...)
 
Moin Helmi,

ich hatte hier mal eine Komponente im Forum zur Verfügung gestellt, die HTML zerlegen kann.
Klasse HTMLDocument
vielleicht hilft Dir die weiter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz