Regex für Links in HTML-Text

7

Ich hoffe, dass diese Frage kein RTFM ist. Ich versuche ein Python-Skript zu schreiben, das Links von einer Standard-HTML-Webseite extrahiert (die <link href... -Tags). Ich habe im Internet nach übereinstimmenden Regexen gesucht und viele verschiedene Muster gefunden. Gibt es einen vereinbarten Standard-Regex, der zu Links passt?

Adam

UPDATE: Ich suche eigentlich nach zwei verschiedenen Antworten:

  1. Was ist die Bibliothekslösung zum Analysieren von HTML-Links? Schöne Suppe scheint eine gute Lösung zu sein (danke, Igal Serban und cletus !)
  2. Kann ein Link mit einem Regex definiert werden?
Adam Matan 10.01.2009, 13:45
quelle

8 Antworten

8

Wie andere vorgeschlagen haben, ist BeautifulSoup eine gute Lösung, wenn keine Echtzeit-ähnliche Leistung erforderlich ist:

%Vor%

Wie für die zweite Frage, ja, HTML-Links sollten gut definiert sein, aber die HTML, die Sie tatsächlich begegnen, ist sehr unwahrscheinlich, Standard zu sein. Das Schöne an BeautifulSoup ist, dass es browserähnliche Heuristiken verwendet, um zu versuchen, das nicht standardmäßige, fehlerhafte HTML zu analysieren, auf das Sie wahrscheinlich stoßen werden.

Wenn Sie sicher sind, dass Sie an Standard-XHTML arbeiten, können Sie (viel) schnellere XML-Parser wie Expat verwenden.

Regex wird aus den oben genannten Gründen (der Parser muss den Status beibehalten, und Regex kann das nicht tun) niemals eine allgemeine Lösung sein.

    
Triptych 10.01.2009, 17:53
quelle
16

Regexes mit HTML werden unordentlich. Verwenden Sie einfach einen DOM-Parser wie Schöne Suppe.

    
cletus 10.01.2009 13:52
quelle
5

Nein, gibt es nicht.

Sie können Beautiful Soup in Erwägung ziehen. Sie können es den Standard zum Analysieren von HTML-Dateien nennen.

    
Igal Serban 10.01.2009 13:53
quelle
4
  

Sollte ein Link keine wohldefinierte Regex sein?

Nein, [X] HTML ist im allgemeinen Fall nicht mit regex analysierbar. Betrachten Sie Beispiele wie:

%Vor%

und das sind nur ein paar zufällige gültige Beispiele; Wenn Sie HTML-Code aus der realen Welt verarbeiten müssen, gibt es eine Million falsch gestalteter Möglichkeiten.

Wenn Sie das genaue Ausgabeformat der Zielseite kennen und sich darauf verlassen können, können Sie mit regex fortfahren. Ansonsten ist es völlig falsch, Webseiten zu scrappen.

    
bobince 10.01.2009 15:10
quelle
3
  

Sollte ein Link keine klar definierte Regex sein? Dies ist eine eher theoretische Frage,

Ich habe die zweite Antwort von PEZ:

  

Ich glaube nicht, dass HTML sich für "gut definierte" reguläre Ausdrücke eignet, da es keine reguläre Sprache ist.

Soweit ich weiß, kann jedes HTML-Tag eine beliebige Anzahl von verschachtelten Tags enthalten. Zum Beispiel:

%Vor%

Um also ein Tag korrekt abzugleichen, müssen Sie in der Lage sein, mindestens Strings des Formulars zu finden:

%Vor%

wobei B den Anfang eines Tags und E das Ende bedeutet. Das heißt, Sie müssen in der Lage sein, Strings zu bilden, die durch eine beliebige Anzahl von Bs gebildet werden, gefolgt von der gleichen Anzahl von E's. Um dies zu tun, muss Ihr Matcher "zählen" können, und reguläre Ausdrücke (d. H. Endliche Automaten) können das einfach nicht (um zu zählen, benötigt ein Automat mindestens einen Stapel). Bezugnehmend auf die Antwort von PEZ ist HTML eine kontextfreie Grammatik, keine reguläre Sprache.

    
Federico A. Ramponi 10.01.2009 15:50
quelle
1

Es hängt ein bisschen davon ab, wie das HTML erzeugt wird. Wenn es etwas kontrolliert ist, können Sie damit durchkommen:

%Vor%     
PEZ 10.01.2009 14:19
quelle
1

Beantworte deine zwei Teilfragen dort.

  1. Ich habe manchmal SGMLParser subclassiert (in der Kernpython-Distribution enthalten) und muss sagen, dass es einfach ist.
  2. Ich glaube nicht, dass HTML sich für "gut definierte" reguläre Ausdrücke eignet, da es keine reguläre Sprache ist.
PEZ 10.01.2009 14:24
quelle
0

Als Antwort auf Frage 2 (sollte kein Link ein gut definierter regulärer Ausdruck sein) ist die Antwort ... nein.

Eine HTML-Link-Struktur ist rekursiv, ähnlich wie Parens und Klammern in Programmiersprachen. Es muss eine gleiche Anzahl von Start- und Endkonstrukten geben und der Ausdruck "link" kann in sich selbst verschachtelt sein.

Um einen "Link" -Ausdruck korrekt zu finden, wäre ein Regex erforderlich, um die Start- und End-Tags zu zählen. Reguläre Ausdrücke sind eine Klasse von Finite Automaten. Definitionsgemäß kann ein finite Automat keine Konstrukte innerhalb eines Musters "zählen". Eine Grammatik ist erforderlich, um eine solche rekursive Datenstruktur zu beschreiben. Die Unfähigkeit einer Regex zu "zählen" ist der Grund, warum Sie Programmiersprachen sehen, die mit Grammatiken im Gegensatz zu regulären Ausdrücken beschrieben werden.

Es ist also nicht möglich, eine Regex zu erstellen, die genau 100% aller "Link" -Ausdrücke entspricht. Es gibt sicherlich Regex, die eine Menge von "Link" mit einem hohen Maß an Genauigkeit übereinstimmen, aber sie werden niemals perfekt sein.

Ich habe kürzlich einen Artikel über dieses Problem geschrieben. Einschränkungen des regulären Ausdrucks

    
JaredPar 10.01.2009 15:48
quelle

Tags und Links