it-swarm.com.ru

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

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

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

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

91
hoju

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

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

if title_search:
    title = title_search.group(1)
135
Krzysztof Krasoń

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

37
iElectric

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

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

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

3
Vinay Sajip

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

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

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

3
Steve K

Пытаться:

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

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

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

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

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

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

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

Однако ...

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

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

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

1
Jim Dennis

Обратите внимание, что начиная с 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
Xavier Guihot