HTML elegant geparst mit dem Html-Agility-Pack

19. August 2008 von Werner Mager · Gelesen: 3705 · heute: 7

Webservices 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)

6 Antworten zu “HTML elegant geparst mit dem Html-Agility-Pack”

  1. Karim sagt:

    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

  2. Werner Mager sagt:

    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

  3. Werner Mager sagt:

    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

  4. daniel sagt:

    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.

  5. Werner Mager sagt:

    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

  6. Werner Mager sagt:

    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

Hinterlasse eine Antwort