it-swarm.com.de

Regulärer Ausdruck zum Extrahieren der URL aus einem HTML-Link

Ich bin ein Neuling in Python. Ich lerne Regex, aber ich brauche hier Hilfe.

Hier kommt die HTML-Quelle:

<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>

Ich versuche, ein Werkzeug zu codieren, das nur http://ptop.se ausgibt. Kannst du mir bitte helfen?

31
IFake

Wenn Sie nur einen suchen:

import re
match = re.search(r'href=[\'"]?([^\'" >]+)', s)
if match:
    print match.group(0)

Wenn Sie eine lange Zeichenfolge haben und jede Instanz des Musters darin haben möchten:

import re
urls = re.findall(r'href=[\'"]?([^\'" >]+)', s)
print ', '.join(urls)

Dabei ist s die Zeichenfolge, in der Sie nach Übereinstimmungen suchen.

Kurze Erklärung der Regexp-Bits:

r'...' ist eine "rohe" Zeichenfolge. Sie müssen sich nicht mehr darum kümmern, Charaktere zu entkommen, als Sie es normalerweise tun würden. (\ besonders - in einer rohen Zeichenfolge ist ein \ nur ein \. In einer regulären Zeichenfolge müssten Sie \\ jedes Mal tun, und dies wird old in Regexxse.)

"href=[\'"]?" sagt aus, um mit "href =" übereinzustimmen, möglicherweise gefolgt von einem ' oder ". "Möglicherweise", weil es schwer zu sagen ist, wie schrecklich der HTML-Code ist, den Sie betrachten, und die Anführungszeichen nicht unbedingt erforderlich sind.

Das Einschließen des nächsten Bits in "()" bedeutet, dass es sich um eine "Gruppe" handelt, was bedeutet, dass es aufgeteilt und separat an uns zurückgegeben wird. Es ist nur eine Möglichkeit zu sagen "das ist der Teil des Musters, an dem ich interessiert bin."

"[^\'" >]+" bedeutet, dass alle Zeichen übereinstimmen, die nicht ', ", > oder ein Leerzeichen sind. Im Wesentlichen ist dies eine Liste von Zeichen, die ein Ende der URL darstellen. Auf diese Weise vermeiden wir den Versuch, einen regulären Ausdruck zu schreiben, der zuverlässig mit einer vollständigen URL übereinstimmt, was ein wenig kompliziert sein kann.

Der Vorschlag in einer anderen Antwort zur Verwendung von BeautifulSoup ist nicht schlecht, führt jedoch zu höheren externen Anforderungen. Außerdem hilft es Ihnen nicht bei Ihrem erklärten Ziel, Regex-Effekte zu lernen, von dem ich annehmen würde, dass dieses spezifische HTML-Parsing-Projekt nur ein Teil davon ist.

Es ist ziemlich einfach zu tun:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_to_parse)
for tag in soup.findAll('a', href=True):
    print tag['href']

Sobald Sie BeautifulSoup installiert haben, sowieso.

66
David

Verwenden Sie keine Regexen, verwenden Sie BeautifulSoup . Das, oder sei so cruftig, um es zum Beispiel zu w3m/lynx zu bringen und sich zurückzuziehen, was w3m/lynx rendert. Erstens ist es wahrscheinlich eleganter, zweitens hat es mit etwas unoptimiertem Code, den ich vor einiger Zeit geschrieben habe, viel schneller gearbeitet.

13
JosefAssad

dies sollte funktionieren, obwohl es vielleicht elegantere Wege gibt.

import re
url='<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>'
r = re.compile('(?<=href=").*?(?=")')
r.findall(url)
11
jannis

John Gruber (der Markdown geschrieben hat, der aus regulären Ausdrücken besteht und hier direkt bei Stack Overflow verwendet wird) hat einen regulären Ausdruck erstellt, der URLs im Text erkennt:

http://daringfireball.net/2009/11/liberal_regex_for_matching_urls

Wenn Sie nur die URL übernehmen möchten (d. H. Sie versuchen nicht wirklich, den HTML-Code zu analysieren), ist dies möglicherweise einfacher als ein HTML-Parser.

10
Paul D. Waite

Regexes sind beim Analysieren von HTML grundsätzlich schlecht (siehe Können Sie einige Beispiele nennen, warum es schwierig ist, XML und HTML mit einem Regex zu analysieren? warum). Was Sie brauchen, ist ein HTML-Parser. Siehe Können Sie ein Beispiel für das Analysieren von HTML mit Ihrem bevorzugten Parser angeben? für Beispiele mit verschiedenen Parsern.

Insbesondere sollten Sie sich die Python-Antworten anschauen: BeautifulSoup , HTMLParser und lxml .

4
Chas. Owens

Ja, es gibt Tonnen von ihnen auf regexlib . Das beweist nur, dass RE nicht dazu verwendet werden sollte. Verwenden Sie SGMLParser oder BeautifulSoup oder schreiben Sie einen Parser - aber keine REs. Diejenigen, die zu funktionieren scheinen, sind äußerst kompliziert und decken dennoch nicht alle Fälle ab.

1
Jarek

Es gibt Tonnen von ihnen auf regexlib

1
Chris S

Dies funktioniert ziemlich gut mit optionalen Übereinstimmungen (Drucke nach href=) und erhält nur den Link. Getestet auf http://pythex.org/

(?:href=['"])([:/.A-z?<_&\s=>0-9;-]+)

Ausgabe:

Übereinstimmung 1./wiki/Main_Page

Match 2./wiki/Portal: Inhalt

Match 3./wiki/Portal: Featured_content

Match 4./wiki/Portal: Aktuelle Veranstaltungen

Match 5./wiki/Special: Zufällig

Match 6. //donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=de

1

Sie können dies verwenden.

<a[^>]+href=["'](.*?)["']
0
arjan

dieser reguläre Ausdruck kann Ihnen helfen, Sie sollten die erste Gruppe nach\1 oder einer anderen Methode in Ihrer Sprache erhalten.

href="([^"]*)

beispiel:

<a href="http://www.amghezi.com">amgheziName</a>

ergebnis:

http://www.amghezi.com
0
Hamedz