Frage

Ich versuche, HTML aus verschiedenen Blogs abzurufen und habe festgestellt, dass verschiedene Anbieter dasselbe Tag auf unterschiedliche Weise verwenden.

Hier sind beispielsweise zwei große Anbieter, die das Meta-Name-Generator-Tag unterschiedlich verwenden:

  • Blogger: <meta content='blogger' name='generator'/> (Inhalt zuerst, Name später und, ja, einfache Anführungszeichen!)
  • WordPress: <meta name="generator" content="WordPress.com" /> (Name zuerst, Inhalt später)

Gibt es eine Möglichkeit, den Wert des Inhalts für alle Fälle zu extrahieren (einfache/doppelte Anführungszeichen, erstes/letztes in der Zeile)?

P.S.Obwohl ich Java verwende, würde die Antwort wahrscheinlich mehr Leuten helfen, wenn sie allgemein für reguläre Ausdrücke wäre.

War es hilfreich?

Lösung

Die Antwort ist: Verwenden Sie keine regulären Ausdrücke.

Ernsthaft.Verwenden Sie einen SGML-Parser oder einen XML-Parser, wenn Sie wissen, dass es sich um gültiges XML handelt (was wahrscheinlich fast nie der Fall ist).Sie werden es absolut vermasseln und jede Menge Zeit damit verschwenden, es richtig zu machen.Nutzen Sie einfach das, was bereits vorhanden ist.

Andere Tipps

Eigentlich sollten Sie wahrscheinlich eine Art HTML-Parser verwenden, mit dem Sie jeden Knoten (und damit Knotenattribute) im DOM der Seite überprüfen können.Ich habe keines davon eine Zeit lang verwendet, daher kenne ich die Vor- und Nachteile nicht, aber hier ist eine Liste http://java-source.net/open-source/html-parsers

Diese Unterschiede sind nach dem XHTML-Standard nicht wirklich wichtig.

Mit anderen Worten: Sie sind genau dasselbe.

Auch wenn Sie doppelte Anführungszeichen durch einfache Anführungszeichen ersetzen, wäre dies dasselbe.

Der typische Weg, ein XML-Dokument zu „normalisieren“, besteht darin, es mithilfe einer API zu parieren, die das Dokument als seine Infoset-Darstellung behandelt.Sowohl DOM- als auch SAX-APIs funktionieren auf diese Weise.

Wenn Sie sie manuell (oder mit einem RegEx) analysieren möchten, müssen Sie all diese Dinge in Ihrem Code replizieren, und meiner Meinung nach ist das nicht praktikabel.

Notiz:Einfache Anführungszeichen (auch keine Anführungszeichen, wenn der Wert kein Leerzeichen enthält) sind gültig gemäß die W3C-HTML-Spezifikation.Zitat:

Standardmäßig erfordert SGML, dass alle Attributwerte entweder durch doppelte Anführungszeichen (ASCII-Dezimal 34) oder einfache Anführungszeichen (ASCII-Dezimal 39) begrenzt werden ...In bestimmten Fällen können Autoren den Wert eines Attributs ohne Anführungszeichen angeben.

Vergessen Sie außerdem nicht, dass die Reihenfolge der Attribute umgekehrt werden kann und dass andere Attribute im Tag erscheinen können.

Vielleicht möchten Sie Javas geben HTMLEditorKit ein Schuss.Es ist einfach, damit zu experimentieren, um herauszufinden, ob die Analyse das liefert, was Sie suchen.

Ok, da Sie nach sprachunabhängigem suchen, können Sie es mit einem REGEX-ähnlichen System versuchen /<meta\s.*content=.*>/ Nehmen Sie das Ergebnis daraus und analysieren Sie die spezifischen Werte, nach denen Sie suchen.Ich bin keineswegs ein REGEX-Experte, daher gibt es wahrscheinlich einen besseren Weg, als das Tool zu verwenden http://www.codehouse.com/webmaster_tools/regex/ Ich habe beide von Ihnen angegebenen Zeichenfolgen abgeglichen.

Wenn Sie Regex verwenden müssen, finden Sie hier einen Regex, um nur den Inhaltsteil zu erhalten:

content\s*=\s*['"].*?['"]

kehrt zurück

content = "blogger"

Und

content='Worpress.com'

jeweils.Ich bin kein Regex-Experte, aber es bekommt diese, wenn man Ihre Beispiele angibt regulärer Ausdruck.

Sobald Sie das verstanden haben, können Sie alles zwischen den Anführungszeichen erhalten, wie Sie möchten, sei es ein weiterer regulärer Ausdruck (was an diesem Punkt einfach unmoralisch ist) oder einfach eine Schleife über die Zeichen.

Wenn Sie Java verwenden, sollten Sie einen Blick darauf werfen Stichwortsuppe, ein SAX-kompatibler Parser für „[Parsen] von HTML, wie es in freier Wildbahn vorkommt“.

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