Wie ordne ich alle Links in Python-Regex zu?
-
21-12-2019 - |
Frage
Ich versuche, einen regulären Ausdruck zu erstellen, der dem Link aus einer Seitenquelle entspricht.Ich habe Text, der wie folgt formatiert ist:
Etwas hier ist hier ein Link
<a class="_5syj" href="https://www.here.com/FirstCal?ref=br_rs">First Cal</a><span class="mls _1ccm9 _49"></span><a class="_fasc" href="https://www.here.com/Mall?ref=br_rs">Mall</a><span class="m1ls _1cm9 _49"></span>
Ich möchte alle Links erhalten, die mit href="https://www.here.com/(.*)?ref=br_rs"> beginnen
Von den Links dazu würde ich also entweder den gesamten Link oder FIrstCal und Mall (vom Link) erhalten.
Python-Code:
regex = r'(?<=href="https://www.here.com/).*(?<=?ref=br_rs)'
link = re.findall(regex, str(source))
link
Aber es funktioniert nicht.
Irgendwelche Ideen ?
PS:Regex wäre die einzige Möglichkeit, dies zu tun.Eine HTML-Analyse funktioniert nicht, da die Website aufgrund ihrer Struktur nicht „stabil“ ist.
Lösung
Verwenden Sie BeautifulSoup mit einem regulären Ausdruck, der genau dem entspricht href
Inhalt:
soup.find_all('a', href=re.compile('https://www.here.com/.*?ref=br_rs'))
Dem Parser ist es egal, ob sich die Struktur ändert, Sie müssen nur genau angeben, was Ist stabil;die Links.
Demo:
>>> import re
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('''\
... <a class="_5syj" href="https://www.here.com/FirstCal?ref=br_rs">First Cal</a><span class="mls _1ccm9 _49"></span><a class="_fasc" href="https://www.here.com/Mall?ref=br_rs">Mall</a><span class="m1ls _1cm9 _49"></span>
... ''')
>>> soup.find_all('a', href=re.compile('https://www.here.com/.*?ref=br_rs'))
[<a class="_5syj" href="https://www.here.com/FirstCal?ref=br_rs">First Cal</a>, <a class="_fasc" href="https://www.here.com/Mall?ref=br_rs">Mall</a>]