Подтвердить что ты не робот

Извлечь часть регулярного выражения

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

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

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

4b9b3361

Ответ 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