Chcę, aby wyrażenie regularne wyodrębniło tytuł ze strony HTML. Obecnie mam to:
title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
title = title.replace('<title>', '').replace('</title>', '')
Czy istnieje wyrażenie regularne do wyodrębniania tylko zawartości <title>, aby nie musieć usuwać tagów?
Odpowiedzi:
Użyj
(
)
w regexp igroup(1)
pythonie, aby pobrać przechwycony ciąg (re.search
zwróci,None
jeśli nie znajdzie wyniku, więc nie używajgroup()
bezpośrednio ):źródło
import re
bo inaczej dostanieszNameError: name 're' is not defined
Zwróć uwagę, że rozpoczynając
Python 3.8
i wprowadzając wyrażenia przypisania (PEP 572) (:=
operator), można nieco ulepszyć rozwiązanie Krzysztofa Krasonia, przechwytując wynik dopasowania bezpośrednio w warunku if jako zmienną i ponownie wykorzystując go w treści warunku :źródło
Spróbuj użyć grup przechwytywania:
źródło
źródło
Mogę polecić Beautiful Soup. Zupa to bardzo dobra biblioteka do analizowania całego dokumentu HTML.
źródło
Próbować:
źródło
.*?
tego w przypadku, gdy</title>
w dokumencie jest wiele (mało prawdopodobne, ale nigdy nie wiadomo).Podane fragmenty kodu nie radzą sobie z
Exceptions
propozycjąZwraca to domyślnie pusty ciąg, jeśli wzorzec nie został znaleziony lub pierwszy pasujący.
źródło
Myślę, że to powinno wystarczyć:
... zakładając, że Twój tekst (HTML) znajduje się w zmiennej o nazwie „tekst”.
Zakłada się również, że nie ma innych tagów HTML, które można legalnie osadzić w tagu HTML TITLE i nie ma możliwości legalnego osadzenia żadnego innego znaku <w takim kontenerze / bloku.
Jednak ...
Nie używaj wyrażeń regularnych do analizowania kodu HTML w Pythonie. Użyj parsera HTML! (Chyba że masz zamiar napisać pełny parser, co byłoby dodatkową pracą, gdy różne parsery HTML, SGML i XML są już w standardowych bibliotekach.
Jeśli obsługujesz „rzeczywisty” kod HTML zupy tagów (który często nie jest zgodny z jakimkolwiek walidatorem SGML / XML), użyj pakietu BeautifulSoup . Nie ma go (jeszcze) w standardowych bibliotekach, ale jest szeroko zalecany do tego celu.
Inną opcją jest: lxml ..., który jest napisany dla odpowiednio skonstruowanego (zgodnego ze standardami) HTML. Ale ma opcję powrotu do używania BeautifulSoup jako parsera: ElementSoup .
źródło