HTML-Dokument analysieren: Regulärer Ausdruck oder LINQ?

8

Versuch, ein HTML-Dokument zu parsen und einige Elemente (irgendwelche Links zu Textdateien) zu extrahieren.

Die aktuelle Strategie besteht darin, ein HTML-Dokument in eine Zeichenfolge zu laden. Dann finden Sie alle Instanzen von Links zu Textdateien. Es könnte ein beliebiger Dateityp sein, aber für diese Frage ist es eine Textdatei.

Das Endziel besteht darin, eine IEnumerable -Liste von String-Objekten zu haben. Dieser Teil ist einfach, aber die Analyse der Daten ist die Frage.

%Vor%

Die ersten Ansätze sind:

  • Laden Sie die Zeichenfolge in ein XML-Dokument und greifen Sie sie Linq-To-Xml an.
  • Erstellen Sie eine Regex, um nach einer Zeichenfolge zu suchen, die mit href= beginnt und mit .txt endet

Die Frage ist:

  • Wie würde diese Regex aussehen? Ich bin ein Regex-Neuling, und das ist Teil meines Regex-Lernens.
  • Mit welcher Methode würden Sie eine Liste von Tags extrahieren?
  • Was wäre der performanteste Weg?
  • Welche Methode wäre am besten lesbar / wartbar?

Aktualisierung: Ein großes Lob an Matthew zum HTML Agility Pack-Vorschlag. Es hat gut funktioniert! Der XPath-Vorschlag funktioniert auch. Ich wünschte, ich könnte beide Antworten als "die Antwort" markieren, aber ich kann es offensichtlich nicht. Sie sind beide gültige Lösungen für das Problem.

Hier ist eine C # -Konsolen-App, die den von vorgeschlagenen Regex verwendet . Es liest die Zeichenfolge in Ordnung und enthält keine href, die nicht mit .txt beendet wird. Mit dem angegebenen Beispiel enthält es die Datei .txt.snarg NICHT korrekt in den Ergebnissen (wie in der HTML-String-Funktion angegeben).

%Vor%     
p.campbell 25.05.2009, 17:58
quelle

4 Antworten

1

Ich würde Regex empfehlen. Warum?

  • Flexibel (case-insensitivity, einfach zu Fügen Sie neue Dateierweiterungen, Elemente hinzu überprüfen, usw.)
  • Schnell zu schreiben
  • Schnell ausgeführt

Regex-Ausdrücke sind nicht schwer zu lesen, solange Sie WRITE-Regexes schreiben können.

Verwenden Sie dies als regulären Ausdruck:

  

href="([^"]*\.txt)"

Erläuterung:

  • Es hat Klammern um die Dateiname, was zu einem "erfasste Gruppe", auf die Sie zugreifen können nachdem jedes Spiel gefunden wurde.
  • Es muss dem "." mit dem Regex-Escape-Zeichen, ein Backslash.
  • Es muss mit jedem Zeichen übereinstimmen, AUSSER doppelte Anführungszeichen: [^ "] bis es
    findet die ".txt"

es wird in eine Escape-Zeichenfolge wie folgt umgesetzt:

%Vor%

Dann können Sie über Ihre Matches iterieren:

%Vor%     
Jeff Meatball Yang 25.05.2009, 18:25
quelle
12

Weder. Laden Sie es in ein (X / HT) MLDocument und verwenden Sie XPath, eine Standardmethode zum Manipulieren von XML und sehr leistungsfähig. Die zu betrachtenden Funktionen sind SelectNodes und SelectSingleNode .

Da Sie anscheinend HTML (nicht XHTML) verwenden, sollten Sie HTML Agility Pack verwenden. Die meisten Methoden und Eigenschaften entsprechen den zugehörigen XML-Klassen.

Beispielimplementierung mit XPath:

%Vor%     
Matthew Flaschen 25.05.2009 18:00
quelle
0

Alternativ zu Matthew Flasches Vorschlag DOM (z. B. wenn Sie an einem X? L-Allergieausbruch leiden)

Manchmal bekommt es einen schlechten Ruf - ich denke, weil Implementierungen manchmal lustig sind, und die nativen COM-Schnittstellen sind ein bisschen unhandlich ohne (kleine) schlaue Helfer, aber ich habe es als robust empfunden , stabile und intuitive / erforschbare Möglichkeit, HTML zu parsen und zu bearbeiten.

    
peterchen 25.05.2009 18:28
quelle
0

REGEX ist nicht schnell, in der Tat ist es langsamer als natives String-Parser-Zeug in .NET. Glaub mir nicht, sieh selbst.

Keines der obigen Beispiele ist schneller als direkt zum DOM.

%Vor%     
JWP 01.03.2011 19:52
quelle

Tags und Links