Frage

Ich habe eine ganze HTML-Webseite in einen String gespeichert, und jetzt Ich mag die „href“ Werte greifen aus den Verbindungen, vorzugsweise mit der Fähigkeit, sie zu verschiedenen Saiten später zu speichern. Was ist der beste Weg, dies zu tun?

Ich habe versucht, die Zeichenfolge als XML-Dokument speichern und Parsen ihm einen XPathDocument Navigator verwenden, aber (was für eine Überraschung) es nicht navigieren kein nicht-wirklich-ein-xml-Dokument zu gut.

Sind reguläre Ausdrücke der am besten Art und Weise zu erreichen, was ich versuche zu erreichen?

War es hilfreich?

Lösung

Reguläre Ausdrücke sind eine Möglichkeit, es zu tun, aber es kann problematisch sein.

Die meisten HTML-Seiten können nicht analysiert unter Verwendung von Standard-HTML-Techniken werden, weil, wie Sie herausgefunden haben, die meisten nicht bestätigen.

Sie könnten die Zeit damit verbringen, zu integrieren versuchen, HTML Tidy oder ein ähnliches Werkzeug, aber es wäre viel schneller bauen nur die Regex Sie benötigen.

UPDATE

Zum Zeitpunkt dieses Updates Ich habe 15 aufgenommen und 9 downvotes. Ich denke, dass vielleicht die Leute nicht, die Frage zu lesen, noch die Kommentare zu dieser Antwort. Alle wollten die OP war tun, um die href Werte greifen. Das ist es. Aus dieser Perspektive eine einfache regex nur in Ordnung ist. Wenn der Autor wollte andere Gegenstände analysieren dann gibt es keine Möglichkeit würde ich regex empfehlen, wie ich am Anfang gesagt, es ist problematisch, am besten.

Andere Tipps

Ich kann die HTML Agility Pack-. Ich habe es in einigen Fällen, in denen ich brauchte HTML zu analysieren und es funktioniert super. Sobald Sie Ihre HTML-Code in es laden, können Sie XPath Ausdrücke abfragen das Dokument und erhalten Sie Ihre Anker-Tags (wie auch gerade über noch etwas da drin).

HtmlDocument yourDoc = // load your HTML;
int someCount = yourDoc.DocumentNode.SelectNodes("your_xpath").Count;

Für den Umgang mit HTML in allen Formen und Größen Ich ziehe das HTMLAgility Pack verwenden @ http: //www.codeplex .com / htmlagilitypack es lässt Sie schreiben XPaths gegen die Knoten, die Sie wollen, und jene Rückkehr in einer Sammlung bekommen.

Wahrscheinlich wollen Sie so etwas wie das Majestic-Parser: http: //www.majestic12. co.uk/projects/html_parser.php

Es gibt ein paar andere Optionen, die mit flockigen html umgehen können, wie gut. Die Html Agility Pack ist einen Blick wert, wie jemand anderes erwähnt wird.

Ich glaube nicht, reguläre Ausdrücke sind eine ideale Lösung für HTML, da HTML nicht kontextfrei ist. Sie werden wahrscheinlich eine ausreichende, wenn ungenau, Ergebnis erzeugen; auch deterministisch eine URI ist ein chaotisch Problem zu identifizieren.

Es ist immer besser, wenn möglich, nicht das Rad neu zu entdecken. Einige gute Tools gibt, die entweder HTML wohlgeformte XML zu konvertieren, oder fungieren als XmlReader:

Hier sind drei gute Werkzeuge:

  1. tagsoup , ein Open-Source-Programm, ist eine Java und SAX - basiertes Tool, entwickelt von John Cowan . Das ist ein SAX-konforme Parser in Java geschrieben, dass anstelle wohlgeformt oder gültige XML-Parsen, HTML analysiert, wie es in der freien Natur zu finden ist: schlecht, böse und brutal, aber recht oft weit von kurz. Tagsoup ist für Leute, die haben das Zeug zu verarbeiten, einen Anschein einer rationalen Anwendung Design. Durch einen SAX-Schnittstelle bereitstellt, ermöglicht es Standard-XML-Tools sogar das Schlimmste HTML angewandt werden. Tagsoup enthält auch eine Befehlszeilenprozessor, die HTML-Dateien liest und kann entweder sauber HTML oder wohlgeformten XML erzeugen, die eine enge Annäherung an XHTML ist.
    Taggle ist ein kommerzielles C ++ Hafen von tagsoup.

  2. SgmlReader ist ein Tool entwickelt von Microsoft Chris Lovett .
    SgmlReader ist ein XmlReader API über jedes SGML Dokuments (einschließlich Unterstützung für HTML gebaut). Ein Befehlszeilenprogramm ist ebenfalls vorgesehen, welche gibt das Ergebnis gut geformt XML.
    Laden Sie die Zip-Datei einschließlich der eigenständige ausführbare Datei und den vollständigen Quellcode: SgmlReader.zip

  3. Eine herausragende Leistung ist die reine XSLT 2.0 Parser von HTML geschrieben von David Carlisle .

seinen Code Lese wäre eine großartige Lernübung für jeden von uns.

Aus der Beschreibung:

" d: htmlparse (string)
d: htmlparse (string, Namespace, html-Modus)
Die eine Form Argument entspricht)
d: htmlparse (string, ' http://ww.w3.org/1999/xhtml ‘, true ()))
Analysiert die Zeichenfolge als HTML und / oder XML einige eingebaute Heuristik) mit
Kontrolle implizierte Öffnen und Schließen der Elemente.
Es hat keine Kenntnis von HTML-DTD aber hat vollständige Liste der Häuser leeren Elemente und vollständige Liste der Entity-Definitionen. HTML-Entitäten und
Dezimal und Hex-Zeichenreferenzen werden alle angenommen. Hinweis HTML-Entitäten
selbst wenn die HTML-mode = false () werden erkannt.
Elementnamen werden klein geschrieben (wenn HTML-Modus gilt ()) und in die
platziert Namensraum durch die Namespace-Parameter angegeben (die „“ sein kann, bezeichnen
No-Namespace, es sei denn der Eingang hat explict Namespace-Deklarationen, in
wobei diese wird geehrt werden.
Attributnamen werden klein geschrieben, wenn HTML-mode = true ()
"

Lesen Sie eine ausführliche Beschreibung hier .

Hoffe, dass dies geholfen hat.

Cheers,

Dimitre Novatchev.

ich mit Chris Lively zustimmen, weil HTML oft nicht sehr gut ausgebildet ist sind Sie wahrscheinlich am besten mit einem regulären Ausdruck aus diesem für.

href=[\"\'](http:\/\/|\.\/|\/)?\w+(\.\w+)*(\/\w+(\.\w+)?)*(\/|\?\w*=\w*(&\w*=\w*)*)?[\"\']

hier auf RegExLib sollten Sie beginnen

Sie werden vielleicht mehr Glück xml verwenden, wenn Sie wissen oder können das Dokument beheben zumindest wohlgeformt zu sein. Wenn Sie gut HTML (oder besser gesagt, xhtml) sollte das xml-System in .Net Lage sein, es zu handhaben. Leider guter html ist extrem selten.

Auf der anderen Seite, reguläre Ausdrücke sind wirklich schlecht in der HTML-Analyse. Glücklicherweise brauchen Sie nicht eine vollständige HTML-Spezifikation zu behandeln. Alles was Sie brauchen zu befürchten ist Parsen href= Strings die URL zu erhalten. Auch dies kann schwierig sein, so dass ich nicht einen Versuch es sofort machen. Ich werde stattdessen, indem er ein paar Fragen beginnen, um zu versuchen und ein paar Grundregeln zu etablieren. Sie sind alle im Grunde laufen auf: „Wie viel wissen Sie über das Dokument?“, Aber hier geht:

  • Sie wissen, ob die „href“ Text immer niedriger Fall sein wird?
  • Wissen Sie, ob es immer doppelte Anführungszeichen, Apostrophe oder nichts um die URL verwenden?
  • Ist es immer eine gültige URL sein, oder müssen Sie für Dinge wie ‚#‘ Konto, JavaScript-Anweisungen und dergleichen?
  • Ist es möglich, mit einem Dokument zu arbeiten, wo der Inhalt HTML-Funktionen beschrieben? (IE: href= auch in dem Dokument sein könnten und nicht zu einem Anker-Tag gehört)
  • Was können Sie uns über das Dokument sagen?

Ich habe einige Code hier verknüpft mit denen Sie verwenden "LINQ to HTML" ...

der Suche nach C # HTML-Parser

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top