Kann Html Agility Pack verwendet werden, um HTML-Fragmente zu analysieren?

.net c# html html-agility-pack parsing

Frage

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:

  • Ich erwarte, dass viele der Eingabedateien fehlerhaften HTML-Code enthalten (fehlende Elemente / Elemente außerhalb der Sequenz usw.)
  • SCRIPT Elemente, die Kommentare und / oder VBScript / JavaScript enthalten, die wie gültige Elemente aussehen, usw.
  • Ich muss spezielle IE-bedingte Kommentare und META und LINK Elemente in IE-bedingten Kommentaren einfügen können
  • Ganz zu schweigen davon, wie HTML keine reguläre Sprache ist

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

Akzeptierte Antwort

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.


Beliebte Antwort

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.



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum