2017-01-19 3 views
0

Es ist eine Weile her, seit ich Regex verwendet habe, und ich denke, das sollte einfach sein, um herauszufinden.Passende URL in HTML mit Regex

Ich habe eine Webseite voller Links, die aussieht wie die string_to_match im folgenden Code. Ich möchte nur die Zahlen in den Links, wie Nummer "58" in der string_to_match greifen. Für das Leben von mir kann ich es nicht herausfinden.

import re 
string_to_match = '<a href="/ncf/teams/roster?teamId=58">Roster</a>' 
re.findall('<a href="/ncf/teams/roster?teamId=(/d+)">Roster</a>',string_to_match) 
+4

Warum verwenden, warum, warum versuchen, die Menschen halten, um [Parse-HTML mit regulären Ausdrücken?!?] (Http://stackoverflow.com/ a/1732454/364696) Verwenden Sie [einen HTML-Parser] (https://www.crummy.com/software/BeautifulSoup/bs4/doc/). Es kann die Tags, die Ihnen wichtig sind, mit den erwarteten Attributen finden, es für Sie herausholen und [URL analysieren] (https://docs.python.org/3/library/urllib.parse.html), um das zu erhalten "GET" -Parameter, die korrekt und weitgehend selbst dokumentierender Code sind. Selbst wenn die Regex schneller sein sollte, ist ein nicht mehr wartbarer und möglicherweise falscher Code keine Verbesserung. – ShadowRanger

+0

Mögliches Duplikat von [RegEx-Übereinstimmungs-Open-Tags außer XHTML-eigenen Tags] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

Antwort

1

Statt reguläre Ausdrücke zu verwenden, können Sie eine Kombination aus HTML Parsing (mit BeautifulSoup Parser) verwenden, um die gewünschte Verbindung zu lokalisieren und extrahieren den href Attributwert und URL-Analyse, die in diesem Fall werden wir verwenden reguläre Ausdrücke für:

import re 
from bs4 import BeautifulSoup 

data = """ 
<body> 
    <a href="/ncf/teams/roster?teamId=58">Roster</a> 
</body> 
""" 

soup = BeautifulSoup(data, "html.parser") 
link = soup.find("a", text="Roster")["href"] 

print(re.search(r"teamId=(\d+)", link).group(1)) 

Drucke 58.

0

Ich würde empfehlen, BeautifulSoup oder lxml zu verwenden, es ist die Lernkurve wert.

... Aber wenn Sie wollen immer noch regexp

re.findall('href="[^"]*teamId=(\d+)',string_to_match)