HTML elegant geparst mit dem Html-Agility-Pack
19. August 2008 von Werner Mager · Gelesen: 3705 · heute: 7Webservices sind mittlerweile der Standard zur Kommunikation über das Internet für Applikationen. Leider steht nicht immer ein Webservice zur Verfügung, so dass einem nichts anderes übrig bleibt, als aus der eigenen Applikation heraus dynamische Html-Seiten zu lesen. Diese sind jedoch in den seltensten Fällen zur programmatischen Auswertung geeignet. Wohlgeformtes XML ist hier nicht zu finden. Mit der Open Source Bibliothek Html-Agility-Pack wird diese Lücke geschlossen.
In diesem Vortrag stelle ich die Bibliothek kurz vor und zeige in praktischen Beispielen, wie Daten von verschiedenen Webseiten (Google.de, dotnet-braunschweig.de …) abgefragt und per XPath-Query verarbeitet werden können. Ergänzend stelle ich ein Hilfstool vor, mit dem die XPath-Abfragen getestet und visualisiert werden können.
Downloads:
Folien zum Vortrag
Demo1 (neu mit HtmlDecode-Funktion von Karim)
Demo2
HtmlVisualiser
Kompletter Vortrag als Webcast:
Webcast herunterladen (30 MB)
20. August 2008 um 16:03
Hallo Werner,
die HTML Steuerzeichen in den geparsten Texten kannst Du mit System.Web.HttpUtility.HtmlDecode() bereinigen.
Gruß und Danke für den Vortrag
Karim
20. August 2008 um 16:45
Hallo Karim,
der Tip mit dem HtmlDecode funktioniert, ich habe es gleich eingebaut und den Download aktualisiert. Hat zwar einen Moment gedauert, bis ich drauf gekommen bin, dass ich die System.Web zu den Ressourcen zufügen muß, aber danach hats geklappt.
Den Mitschnitt des Vortrags werde ich demnächst noch hochladen, ich wollte vorher nur noch die Passagen mit den Audio-Problemen abschneiden.
Gruß
Werner
24. August 2008 um 19:59
Beim Vortrag kam u.a. auch die Frage auf, ob man das AgilityPack auch mit Linq benutzen kann.
Antwort: JA
Hier steht wie es geht:
http://vijay.screamingpens.com/archive/2008/05/26/linq-amp-lambda-part-3-html-agility-pack-to-linq.aspx
17. Januar 2009 um 20:34
guter Beitrag!
den Xpath kann man relativ einfach mit dem Firefox-Plugin Firebug auslesen. dann muss man sich nicht wie im Visualizer durch den Baum hangeln.
Komischerweise unterscheiden sich aber die XPaths vom Html-Agility-Pack und von Firebug. Hast du irgendeine Lösung dafür?
Ich möchte eigentlich den XPath über Firebug bekommen, weil das nicht so aufwendig ist.
21. Januar 2009 um 23:23
Hallo Daniel,
Danke für deinen Kommentar
Sorry dass ich ihn jetzt erst sehe/freischalte/beantworte.
Ich habe mir mal den Firebug installiert, das Plugin ist auf jeden Fall sehr nützlich!
Bei meinen ersten Tests hat Firebug eigentlich ganz ordentliche XPath-Ausdrücke generiert, die auch Agility-Pack gültig sind.
Firebug verwendet dabei als Kennzeichen das Attribut “id”, (z.B. //*[@id=”content-main”]) was sinnvoll ist falls das Element nicht immer an der gleichen Stelle im Dokument erscheint.
Hat das gewählte Element keine “id”, so gibt Firebug den Pfad von ganz oben bis zu dem Element an.
Beide Adress-Varianten hat das Agility-Pack bei mir problemlos akzeptiert. Einzig unschön ist vielleicht, dass Firebug für das erste Element nie einen Index vergibt (auch wenn es mehrere vom gleichen Typ gibt), wodurch das Agility-Pack u.U. mehrere Ergebnisse liefert, ob wohl nur ein Knoten gewünscht war.
z.B. :
/html/body/div[2]/div[2]/div/h3/img
Statt
/html[1]/body[1]/div[2]/div[2]/div[1]/h3[1]/img[1]
Erstere Variante ist halt missverständlich, wenn unter dem letzten h3 mehrere img’s kommen. (Alle Beispiele beziehen sich auf “https://addons.mozilla.org/de/firefox/addon/1843″)
Hast du ansonsten mal ein konkretes Beispiel wo die XPath-Anweisung nicht paßt?
Gruß
Werner
22. Oktober 2011 um 23:19
Ich bin gerade über eine sehr gute Seite mit XPath Examples gestoßen, und ich dachte mir, bvor ich den Link wieder verliere poste ich ihn hier
http://msdn.microsoft.com/en-us/library/ms256086.aspx