2012-04-04 15 views
3

Ich habe nach Fragen über das Finden von Inhalten auf einer Seite gesucht, und viele Antworten empfehlen DOM beim Parsen von Webseiten anstelle von REGEX. Wieso ist es so? Verbessert es die Bearbeitungszeit oder so.Warum Dom zum Parsen von Webseiten anstelle von Regex verwenden?

+0

DOM ist flüssig. Sie können dynamisch auf jede Eigenschaft zugreifen. – hjpotter92

+3

Werfen Sie einen Blick auf http://stackoverflow.com/questions/701166/can-you-provide-some-example-of-with-it-is-hard-to-parse-xml-and-html-with-a -reg – Qtax

+1

@Qtax - Wirklich?Ich [obwohl] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) ist viel überzeugender ... – Oded

Antwort

6

Ein DOM-Parser analysiert die Seite tatsächlich.

Ein regulärer Ausdruck sucht nach Text, ohne die semantische Bedeutung des HTML zu verstehen.

Es ist nachweisbar, dass HTML keine reguläre Sprache ist; Daher ist es unmöglich einen regulären Ausdruck zu erstellen, der alle Instanzen eines beliebigen Element-Musters aus einem HTML-Dokument analysieren wird, ohne auch Text zu vergleichen, der keine Instanz dieses Element-Musters ist.

Sie können in der Lage sein, einen regulären Ausdruck zu entwerfen, der für Ihren speziellen Anwendungsfall funktioniert, aber genau den HTML-Code voraussagt, mit dem Sie bereitgestellt werden (und folglich, wie es Ihren eingeschränkten Anwendungsfall unterbricht) Regex) ist extrem schwierig.

Außerdem ist eine Regex schwieriger an Änderungen in den Inhalten einer Seite anzupassen als ein XPath-Ausdruck, und der XPath ist (meiner Meinung nach) einfacher zu lesen, da er sich nicht mit syntaktischen Kleinigkeiten wie Tag-Öffnungen beschäftigen muss und Schließungen.

Anstatt das falsche Werkzeug für den Job (ein Textanalysewerkzeug für ein strukturiertes Dokument) zu verwenden, verwenden Sie also das richtige Werkzeug für den Job (einen HTML-Parser zum Analysieren von HTML).

+1

"Regex" sind nicht regulär, zB http://stackoverflow.com/questions/7434272/match-an-bn-cn-e-g-aaabbbcccc-using-regular-expressions-pcre – Qtax

+0

@ Qtax Ja, in der Theorie. Aber das ist dann nicht geeignet, echte kontextfreie Sprachen zu analysieren. Wie HTML, weißt du? Es ist sogar lockerer als XML in der freien Form, und ich wage es, dass Sie eine Regex entwickeln, die XML 1.1 richtig analysiert. Oder sogar eine willkürliche, nichttriviale Sprache, die auf XML aufbaut. – delnan

+0

@delnan, ob es passt oder nicht, hängt von der Situation und der Sprache ab. Sehen Sie sich die Kommentare zu dieser Frage an. Ich habe nicht gesagt, dass es angemessen ist, Regex zu verwenden, um HTML zu analysieren (im Allgemeinen), dafür gibt es bessere Tools. Oh, und ich wage es, ein Flugzeug mit den gleichen Spezifikationen wie A380 zu bauen. [...] Nur weil du es nicht kannst, heißt das nicht, dass es unmöglich ist. – Qtax

-1

Meiner Meinung nach ist es sicherer, REGEXP auf Seiten zu verwenden, auf denen Sie keine Kontrolle über den Inhalt haben: HTML möglicherweise nicht richtig gebildet, dann DOM-Parser kann fehlschlagen.

Bearbeiten:
Nun, überlegt, was ich gerade gelesen habe, sollten Sie wahrscheinlich regexp nur verwenden, wenn Sie sehr kleine Dinge benötigen, wie alle Links eines Dokuments, e TC.

+3

Dieser Satz ist falsch herum! Regex ist zweifellos weniger zuverlässig als das DOM zum Abrufen von HTML, wenn der HTML-Code nicht richtig formatiert ist, sollte die Seite sowieso nicht funktionieren! –

+1

Es gibt DOM-Parser (in jedem Browser und in Bibliotheken wie [BeautifulSoup] (http://www.crummy.com/software/BeautifulSoup/)), die einen wirklich guten Job machen, wenn es darum geht, * ungültiges HTML zu brechen, sondern eher das Beste daraus machen. Gibt dir die ganze Macht, ohne stundenlange Regex-Dreharbeiten zu machen, und verlässt nicht in Angst und Unsicherheit, dass deine Sachen auf der nächsten Seite brechen werden. – delnan

1

Ich kann nicht hören, dass "HTML keine reguläre Sprache ..." mehr ist. Reguläre Ausdrücke (wie sie in heutigen Sprachen verwendet werden) sind ebenfalls nicht regulär.

Die einfache Antwort ist:

Ein regulärer Ausdruck ist kein Parser, beschreibt es ein Muster, und es wird dieses Muster passen, aber es hat keine Ahnung von der Dokumentstruktur. Sie können nichts mit einer Regex analysieren. Natürlich können Regexes Teil eines Parsers sein, ich weiß es nicht, aber ich nehme an, dass fast jeder Parser intern Regexes verwendet, um bestimmte Untermuster zu finden.

Wenn Sie dieses Muster für das Zeug, das Sie in HTML finden möchten, erstellen können, verwenden Sie es. Aber sehr oft wäre es nicht möglich, dieses Muster zu erstellen, da es praktisch nicht möglich ist, alle Eckfälle oder Abhängigkeiten wie alle Links zu finden, aber nur wenn sie grün und nicht rosa sind.

In den meisten Fällen ist es viel einfacher, einen Parser zu verwenden, der die Struktur Ihres Dokuments versteht, der auch eine Menge "kaputten" HTML akzeptiert. Es erleichtert Ihnen den Zugriff auf alle Verknüpfungen oder alle Tabellenelemente einer bestimmten Tabelle oder ...

Verwandte Themen