Webseiten mit dem HTML-Parser Agility-Pack einlesen -oder- Google mit C# in 8 Zeilen Code abfragen
16. Mai 2008 von Werner Mager · Gelesen: 4064 · heute: 2Vor kurzem bin ich mal wieder über die Problemstellung gestolpert, aus einer C#-Anwendung heraus eine Webseite auszulesen und zu parsen. Bisher habe ich dazu immer brav ein Http-WebRequest kreiert und aus dem Responsestream die einzelnen Zeilen der Html-Antwort ausgewertet. Da dies nicht sehr flexibel ist, habe ich mich nach einem eleganteren Weg umgesehen und bin schließlich auf die Opensource Bibliothek Html Agility Pack gestoßen, welche mich absolut überzeugt hat. Mit wenigen Zeilen kann man z.B. eine Google-Anfrage stellen, was ich im Folgenden kurz demonstrieren möchte.
Download und Kompilieren der Bibliothek
Zunächst muss die Html Agility Pack Bibliothek herunter geladen werden. Hier erhält man den Sourcecode der Bibliothek. Diese muss dann entpackt und die Datei HtmlAgilityPack.sln im Visual Studio geöffnet werden. Neben dem Play-Button ist nun statt “Debug” der Modus “Release” auszuwählen. Nun kann die Bibliothek durch den Befehl “Build Solution” (F6) übersetzt werden. Als Ergebnis erhält man in dem Unterordner HtmlAgilityPack\bin\Release die Datei HtmlAgilityPack.dll.
Die Bibliothek einbinden
Um die Bibliothek in einem eigenen Projekt zu verwenden, empfiehlt es sich, sie erst einmal in das Hauptverzeichnis des Projektes zu kopieren. Das Einbinden erfolgt durch einen Rechtsklick auf den Zweig “References” im Solution Explorer über “Add Reference”. Hier muss nun die Bibliothek ausgewählt werden.
Eine Webanfrage an Google mit nur 8 Zeilen Code
Für den Zugriff auf Google wird ein WebClient verwendet (Namespace System.Net). Damit Google uns wie einen Browser behandelt, müssen wir zudem den Parameter User-Agent setzten. Wir geben uns als Internet Explorer 7 aus:
// We use a Webclient to query and impersonate as Internet Explorer 7 WebClient client = new WebClient(); client.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)");
Das Einlesen erfolgt nun mit den Objekten HtmlDocument und HtmlNode aus dem Namespace HtmlAgilityPack in 3 Zeilen:
// Read the html-page and select the root-node HtmlDocument doc = new HtmlDocument(); doc.Load(client.OpenRead("http://www.google.de/search?q=sternico+blog")); HtmlNode rootNode = doc.DocumentNode;
Als Ergebnis erhalten wir nun ein XML-Dokument, das die gesamte Antwortseite von Google erhält. Die Frage ist nun, wie wir am besten die Suchergebnisse extrahieren können. Schaut man sich im Internet-Explorer den Quelltext zu einem Google-Suchergebnis an, so sieht man, dass die Ergebnisse als HTML-Link mit dem Attribut class=l aufgebaut sind:
<a href=”http://blog.sternico.de/?p=4” class=l onmousedown=”return clk(this.href,”,”,’res’,'1′,”)”><b>Sternico Blog</b>» Blogarchiv » Active Directory mit Excel auslesen</a>
Dies können wir uns zu nutze machen und eine sogenannte XPath Abfrage auf das XML-Dokument anwenden. Die XPath-Abfragesprache scheint auf den ersten Blick sehr kompliziert, ist es aber nicht. Um alle Links mit der Klasse “l” zu erhalten müssen wir lediglich folgenden String angeben: //a[@class=’l']
Praktisch sieht das ganze nun so aus:
// Now select all links by using xpath and loop over the results. HtmlNodeCollection results = rootNode.SelectNodes("//a[@class=’l']"); foreach (HtmlNode link in results) { Console.WriteLine(link.Attributes["href"].Value); }
Wie gewohnt habe ich das ganze in einem Visual Studio Projekt zusammen gefasst und ein wenig abgerundet.
Das Projekt steht hier zum Download bereit:
11. September 2009 um 20:18
What a great tutorial.
very useful, thanks a lot!
best regards
frey
11. Dezember 2009 um 11:19
nice example!