Извлечь часть соответствия регулярному выражению - PullRequest
89 голосов
/ 25 августа 2009

Я хочу, чтобы регулярное выражение извлекало заголовок из HTML-страницы. В настоящее время у меня есть это:

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

Существует ли регулярное выражение для извлечения только содержимого , поэтому мне не нужно удалять теги?

Ответы [ 8 ]

133 голосов
/ 25 августа 2009

Используйте ( ) в регулярном выражении и group(1) в Python для извлечения захваченной строки (re.search вернет None, если не найдет результат, поэтому не используйте group() напрямую ):

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

if title_search:
    title = title_search.group(1)
6 голосов
/ 25 августа 2009

Попробуйте использовать группы захвата:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
3 голосов
/ 27 октября 2013

Предоставленные фрагменты кода не справляются с Exceptions Могу ли я предложить

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

Возвращает пустую строку по умолчанию, если шаблон не найден или первое совпадение.

3 голосов
/ 25 августа 2009

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

2 голосов
/ 01 марта 2013

Могу я порекомендовать вас к Beautiful Soup. Soup - очень хорошая библиотека для разбора всего вашего HTML-документа.

soup = BeatifulSoup(html_doc)
titleName = soup.title.name
2 голосов
/ 25 августа 2009

Попробуйте:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
1 голос
/ 27 апреля 2019

Обратите внимание, что начиная с Python 3.8 и введением выражений присваивания (PEP 572) (оператор :=), можно немного улучшить решение Кшиштофа Красона с помощью захват результата совпадения непосредственно в условии if в качестве переменной и его повторное использование в теле условия:

# pattern = '<title>(.*)</title>'
# text = '<title>hello</title>'
if match := re.search(pattern, text, re.IGNORECASE):
  title = match.group(1)
# hello
1 голос
/ 25 августа 2009

Я думаю, этого должно быть достаточно:

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

... при условии, что ваш текст (HTML) находится в переменной с именем "text."

Это также предполагает, что нет других тегов HTML, которые могут быть юридически встроены в тег HTML TITLE, и нет способа юридически встроить любой другой символ <в такой контейнер / блок. </p>

Однако ...

Не используйте регулярные выражения для разбора HTML в Python. Используйте анализатор HTML! (Если вы не собираетесь писать полный синтаксический анализатор, что потребует дополнительной работы, когда различные стандартные синтаксические анализаторы HTML, SGML и XML уже находятся в стандартных библиотеках.

Если вы обрабатываете теговый суп «реального мира» HTML (который часто не соответствует ни одному валидатору SGML / XML), используйте пакет BeautifulSoup . Это не входит в стандартные библиотеки (пока), но широко рекомендуется для этой цели.

Другой вариант: lxml ..., который написан для правильно структурированного (соответствующего стандартам) HTML. Но у него есть возможность отказаться от использования BeautifulSoup в качестве парсера: ElementSoup .

...