Извлечение части совпадения регулярных выражений


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

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

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

, поэтому мне не нужно удалять теги?
8 65

8 ответов:

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

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

if title_search:
    title = title_search.group(1)

пожалуйста, не используйте регулярное выражение для разбора языков разметки. Используйте lxml или beautifulsoup.

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

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

попробуй:

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

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

могу я порекомендовать вам красивый суп. Суп-это очень хорошая библиотека для разбора всего вашего html-документа.

soup = BeatifulSoup(html_doc)
titleName = soup.title.name

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

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

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

Я думаю, что этого должно хватить:

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

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

это также предполагает, что нет других тегов HTML, которые могут быть юридически встроены в тег заголовка HTML и нет способа юридически встроить любой другой символ

...

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

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

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