wake-up-neo.com

Extrahieren Sie einen Teil eines Regex-Matches

Ich möchte, dass ein regulärer Ausdruck den Titel aus einer HTML-Seite extrahiert. Derzeit habe ich folgendes:

title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
    title = title.replace('<title>', '').replace('</title>', '') 

Gibt es einen regulären Ausdruck, um nur den Inhalt von <title> zu extrahieren, damit ich die Tags nicht entfernen muss?

94
hoju

Verwenden Sie () In regulären Ausdrücken und group(1) in python zum Abrufen der erfassten Zeichenfolge ( re.search gibt None zurück, wenn es das Ergebnis nicht findet, also benutze group() nicht direkt) :

title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE)

if title_search:
    title = title_search.group(1)
143

Verwenden Sie KEIN Regex, um Auszeichnungssprachen zu analysieren. Verwenden Sie lxml oder beautifulsoup.

37
iElectric

Versuchen Sie es mit Erfassungsgruppen:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
6
Aaron Maenpaa

re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)

3
Vinay Sajip

Die bereitgestellten Codeteile sind nicht mit Exceptions kompatibel. Darf ich vorschlagen

getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0]

Dies gibt standardmäßig eine leere Zeichenfolge zurück, wenn das Muster nicht gefunden wurde oder die erste Übereinstimmung vorliegt.

3
Steve K

Beachten Sie, dass ab Python 3.8 und die Einführung von Zuweisungsausdrücke (PEP 572) (:= Operator), es ist möglich, Krzysztof Krasońs Lösung etwas zu verbessern, indem das Übereinstimmungsergebnis direkt in der if-Bedingung als Variable erfasst und im Hauptteil der Bedingung wiederverwendet wird:

# pattern = '<title>(.*)</title>'
# text = '<title>hello</title>'
if match := re.search(pattern, text, re.IGNORECASE):
  title = match.group(1)
# hello
3
Xavier Guihot

Versuchen:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
2
Randy

Darf ich Sie zu Beautiful Soup empfehlen? Soup ist eine sehr gute Bibliothek, um Ihr gesamtes HTML-Dokument zu analysieren.

soup = BeatifulSoup(html_doc)
titleName = soup.title.name
2
kharagpur

Ich denke, das sollte ausreichen:

#!python
import re
pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE)
pattern.search(text)

... unter der Annahme, dass sich Ihr Text (HTML) in einer Variablen mit dem Namen "text" befindet.

Dies setzt auch voraus, dass es keine anderen HTML-Tags gibt, die legal in ein HTML-TITLE-Tag eingebettet werden können, und keine Möglichkeit, ein anderes <-Zeichen legal in einen solchen Container/Block einzubetten.

Allerdings ...

Verwenden Sie keine regulären Ausdrücke zum Parsen von HTML in Python. Verwenden Sie einen HTML-Parser! (Es sei denn, Sie schreiben einen vollständigen Parser. Dies wäre eine zusätzliche Arbeit, wenn sich bereits verschiedene HTML-, SGML- und XML-Parser in den Standardbibliotheken befinden.

Wenn Sie mit "real world" Tag-Suppe HTML (das häufig nicht mit einem SGML/XML-Validator übereinstimmt) umgehen, verwenden Sie BeautifulSoup) Paket. Es ist (noch) nicht in den Standardbibliotheken enthalten, wird jedoch für diesen Zweck allgemein empfohlen.

Eine weitere Option ist: lxml ..., die für ordnungsgemäß strukturiertes (standardkonformes) HTML geschrieben wurde. Es besteht jedoch die Möglichkeit, auf die Verwendung von BeautifulSoup als Parser zurückzugreifen: ElementSoup .

1
Jim Dennis