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?
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)
Verwenden Sie KEIN Regex, um Auszeichnungssprachen zu analysieren. Verwenden Sie lxml oder beautifulsoup.
Versuchen Sie es mit Erfassungsgruppen:
title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)
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.
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
Versuchen:
title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
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
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 .