Forum: PC-Programmierung Baumstruktur der HTML-Elemente einer Webseite ermitteln


von Matt B. (mattb)


Lesenswert?

Hallo,

ich muss Daten aus HTML-Seiten auslesen. Dafür verwende ich in C# 
mshtml. Ich bin soweit, dass ich die HTML-Seite in Form einer 
HTMLDocumentClass in einer Variable vorliegen habe.

Wie kann ich daraus die HTML-Elemente auslesen? Das ganze Wochenende 
habe ich versucht eine zusammenhängende Baumstruktur der Elemente zu 
finden. Aber ich komme einfach nicht weiter.

Danke für eure Hilfe!

von STK500-Besitzer (Gast)


Lesenswert?

Anker-Tags sind doch die Wurzeln deiner Baumstruktur.
Wenn per Anker-Tag eine HTML- oder PHP-Datei aufgerufen wird, dann hast 
du den nächsten Zweig...
Wie das in C# geht, weiß ich nicht.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Und was ist jetzt dein Problem?

- Der Aufbau der Website
- Die HTMLDocumentClass
- Du hast keine Ahnung von HTML
- Du siehst vor lauter Wald den Baum nicht
- ...

HTMLDocumentClass > BODY > Children ist doch eigentlich recht 
straight-forward...

STK500-Besitzer schrieb:
> Anker-Tags sind doch die Wurzeln deiner Baumstruktur.

Es geht ihm un die Elemente an sich, nicht die Navigationsstruktur und 
die Verlinkung per "Anker" ist in den allermeisten Fällen ganz sicher 
kein Baum sondern ein Graph.

: Bearbeitet durch User
von Matt B. (mattb)


Lesenswert?

Hab das Problem gefunden. Ich habe die Baumstruktur in der Überwachung 
von Visual Studio gesucht. Bei COM Objekten werden diese anscheinend 
nicht angezeigt. Durch einen Cast kann jetzt auf den Baum zugreifen.

Zum Einlesen der Struktur habe ich auf die schnelle einfach mal eine 
Funktion geschrieben, der ich den Body der HTML als IHTMLElement 
übergebe. Sie durchläuft alle ihre Kinder. Durch einen rekursiven Aufruf 
der Funktion werden dann von den Body-Kindern wiederum alle Kinder 
durchloffen. Es werden also alle Kinder und "Enkelkinder" usw. vom Body 
durchlaufen. Eine Verarbeitung der Daten findet nicht statt.

Die HTML-Seite besitzt in etwa 40000 Elemente. Ich ging davon aus, dass 
die recht zügig durchloffen wären. Real hat die Durchlaufen aber um die 
6 Minuten gebraucht...
1
private static void AlleKinderDurchlaufen(IHTMLElement eltern_element)
2
{
3
    foreach (IHTMLElement kind in (IHTMLElementCollection)eltern_element.children)
4
    {
5
        AlleKinderdurchlaufen(kind);
6
    }
7
}

Das ist für meine Anwendung alles andere als akzeptabel. Kann ich das 
irgendwie beschleunigen?

: Bearbeitet durch User
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Matt B. schrieb:
> Die HTML-Seite besitzt in etwa 40000 Elemente. Ich ging davon aus, dass
> die recht zügig durchloffen wären. Real hat die Durchlaufen aber um die
> 6 Minuten gebraucht...

Profiler aktivieren->schauen wo die Zeit verbraucht wird (z.B. laden des 
HTMLs...)


Matt B. schrieb:
> Das ist für meine Anwendung alles andere als akzeptabel. Kann ich das
> irgendwie beschleunigen?

Wenn du weißt wo die Zeit verloren geht und was du erreichen willst, 
kann man Tips geben. Ansonsten in der Allgemeinheit: Nein.

Caching und gezieltes auswählen der Elemente würde sicher helfen.

: Bearbeitet durch User
von bluppdidupp (Gast)


Lesenswert?

Schöner HTML-Parser ist auch: http://htmlagilitypack.codeplex.com/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.