Извлечь часть регулярного выражения
Я хочу, чтобы регулярное выражение для извлечения заголовка из HTML-страницы. В настоящее время у меня есть это:
title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
title = title.replace('<title>', '').replace('</title>', '')
Существует ли регулярное выражение для извлечения только содержимого <title>, поэтому мне не нужно удалять теги?
Ответы
Ответ 1
Используйте (
)
в regexp и group(1)
в python для извлечения захваченной строки (re.search
вернет None
, если он не найдет результат, поэтому не используйте group()
напрямую):
title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE)
if title_search:
title = title_search.group(1)
Ответ 2
Пожалуйста, не используйте регулярное выражение для разбора языков разметки. Используйте lxml или beautifulsoup.
Ответ 3
Попробуйте использовать группы захвата:
title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
Ответ 4
re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)
Ответ 5
Try:
title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
Ответ 6
Использование регулярных выражений для синтаксического анализа HTML обычно не является хорошей идеей. Для этого вы можете использовать любой парсер HTML, например Beautiful Soup. Проверьте http://www.crummy.com/software/BeautifulSoup/documentation.html
Также помните, что некоторые люди, столкнувшись с проблемой, думают: "Я знаю, я буду использовать регулярные выражения". Теперь у них есть две проблемы.
Ответ 7
Могу ли я порекомендовать вам прекрасный суп. Суп - очень хорошая библиотека для анализа всего вашего html-документа.
soup = BeatifulSoup(html_doc)
titleName = soup.title.name
Ответ 8
Предоставленные фрагменты кода не справляются с Exceptions
Могу ли я предложить
getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0]
Это возвращает пустую строку по умолчанию, если шаблон не найден или первое совпадение.
Ответ 9
Я думаю, это должно быть достаточно:
#!python
import re
pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE)
pattern.search(text)
... предполагая, что ваш текст (HTML) находится в переменной с именем "текст".
Это также предполагает, что нет других тэгов HTML, которые могут быть юридически встроены внутри тега HTML TITLE и не могут легально внедрять любые другие < символ внутри такого контейнера/блока.
Однако...
Не используйте регулярные выражения для разбора HTML в Python. Используйте парсер HTML! (Если вы не собираетесь писать полный парсер, что было бы дополнительной работой, когда различные XML, SGML и XML-парсеры уже находятся в стандартных библиотеках.
Если ваша обработка "реального мира" тега супа HTML (который часто не соответствует какому-либо SGML/XML-валидатору), используйте BeautifulSoup. Это не в стандартных библиотеках (пока), но рекомендуется для этой цели.
Другой вариант: lxml..., который написан для правильно структурированного (стандартного соответствия) HTML. Но у него есть возможность отказаться от использования BeautifulSoup в качестве синтаксического анализатора: ElementSoup.
Ответ 10
Обратите внимание, что начиная с Python 3.8
и введением выражений присваивания (PEP 572) (:=
оператор), можно немного улучшить решение Krzysztof Krasoń, захватив результат сравнения непосредственно в условии if в качестве переменной и повторно использовать его в состоянии кузова:
# pattern = '<title>(.*)</title>'
# text = '<title>hello</title>'
if match := re.search(pattern, text, re.IGNORECASE):
title = match.group(1)
# hello