Ich muss LINK
und META
Elemente von ASP.NET-Seiten, Benutzersteuerelementen und Masterseiten abrufen, deren Inhalt abrufen und dann aktualisierte Werte in diese Dateien in einem Dienstprogramm schreiben, an dem ich gerade arbeite.
Ich könnte versuchen, reguläre Ausdrücke zu verwenden, um nur diese Elemente zu erfassen, aber es gibt mehrere Probleme mit diesem Ansatz:
SCRIPT
Elemente, die Kommentare und / oder VBScript / JavaScript enthalten, die wie gültige Elemente aussehen, usw. META
und LINK
Elemente in IE-bedingten Kommentaren einfügen können Ich habe einige HTML-Parser in .NET recherchiert und viele SO-Posts und Blogs empfehlen das HTML Agility Pack . Ich habe es vorher noch nie benutzt und ich weiß nicht, ob es kaputte HTML- und HTML-Fragmente analysieren kann. (Stellen Sie sich zum Beispiel ein Benutzersteuerelement vor, das nur ein HEAD
Element mit einem Inhalt enthält - kein HTML
oder BODY
.) Ich weiß, dass ich die Dokumentation lesen könnte, aber es würde mir eine Menge Zeit sparen, wenn jemand Ratschläge geben könnte. (Bei den meisten SO-Posts werden vollständige HTML-Seiten analysiert.)
Absolut, das ist, was es auszeichnet.
Tatsächlich können viele Webseiten, die Sie im Internet finden, aufgrund fehlender <html>
-Tags oder falsch geschlossener Tags als HTML-Fragmente bezeichnet werden.
Das HtmlAgilityPack simuliert, was der Browser zu tun hat - versuchen Sie, Sinn aus dem manchmal unübersichtlichen Tag zu machen. Eine unvollkommene Wissenschaft, aber HtmlAgilgityPack macht es sehr gut.
Eine Alternative zum Html Agility Pack ist CsQuery , ein C # jQuery-Port, von dem ich der Hauptautor bin. Sie können CSS-Selektoren und die vollständige Query-API verwenden, um auf das DOM zuzugreifen und es zu bearbeiten, was für viele einfacher ist als XPATH. Darüber hinaus ist der HTML-Parser speziell für eine Vielzahl von Zwecken gedacht und es gibt mehrere Möglichkeiten, HTML zu analysieren: als vollständiges Dokument (fehlendes html, body
Tags werden hinzugefügt und verwaister Inhalt wird innerhalb des Körpers verschoben); als Inhaltsblock (dh es wird nicht als vollständiges Dokument tbody
, sondern optionale Tags wie tbody
, die im DOM noch obligatorisch sind, werden automatisch hinzugefügt, genau wie Browser) und als echtes Fragment, wo keine Tags sind erstellt (zB wenn Sie nur mit Bausteinen arbeiten).
Weitere Informationen finden Sie unter Erstellen eines neuen DOMs .
Darüber hinaus wurde der HTML-Parser von CsQuery so entworfen, dass er die HTML5-Spezifikation für optionale schließende Tags berücksichtigt. Zum Beispiel sind das Schließen von p
Tags optional, aber es gibt bestimmte Regeln, die bestimmen, wann der Block geschlossen werden sollte. Um das gleiche DOM wie ein Browser zu erzeugen, muss der Parser die gleichen Regeln implementieren. CsQuery bietet dadurch einen hohen Grad an Kompatibilität mit dem Browser-DOM für eine bestimmte Quelle.
Die Verwendung von CsQuery ist sehr einfach, z
CQ docFromString = CQ.Create(htmlString);
CQ docFromWeb = CQ.CreateFromUrl(someUrl);
// there are other methods for asynchronous web gets, creating from files, streams, etc.
// css selector: the indexer [] is like jQuery $(..)
CQ lastCellInFirstRow = docFromString["table tr:first-child td:last-child"];
// Text() is a jQuery method returning text contents of selection
string textOfCell = lastCellInFirstRow.Text();
Schließlich indiziert CsQuery Dokumente für Klassen-, ID-, Attribut- und Tag-Selektoren extrem schnell im Vergleich zum Html Agility Pack.