Extracto de parte de un partido de expresiones regulares
-
19-09-2019 - |
Pregunta
Quiero una expresión regular para extraer el título de una página HTML. Actualmente tengo esto:
title = re.search('<title>.*</title>', html, re.IGNORECASE).group()
if title:
title = title.replace('<title>', '').replace('</title>', '')
¿Hay una expresión regular para extraer sólo el contenido de
Solución
(
Uso de expresiones regulares y )
en group(1)
en Python para recuperar la cadena capturado ( re.search
volverá None
si no encuentra el resultado, por lo que no utilice directamente group()
):
title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE)
if title_search:
title = title_search.group(1)
Otros consejos
Trate de usar grupos de captura:
title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
Tenga en cuenta que a partir Python 3.8
, y la introducción de (PEP 572) (operador :=
), es posible mejorar un poco en la solución de Krzysztof Krason capturando directamente el resultado del partido en el caso condición como una variable y volver a usarlo en el cuerpo de la condición:
# pattern = '<title>(.*)</title>'
# text = '<title>hello</title>'
if match := re.search(pattern, text, re.IGNORECASE):
title = match.group(1)
# hello
re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)
Las piezas proporcionadas de código de no hacer frente a Exceptions
¿Puedo sugerir
getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0]
Esto devuelve una cadena vacía por defecto si el patrón no se ha encontrado, o el primer partido.
Probar:
title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1)
¿Puedo recomendar a sopa de Hermosa. La sopa es un muy buen lib para analizar la totalidad de su documento HTML.
soup = BeatifulSoup(html_doc)
titleName = soup.title.name
pensaría que esto debería ser suficiente:
#!python
import re
pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE)
pattern.search(text)
... suponiendo que su texto (HTML) está en una variable llamada "texto".
Esto también supone que no hay otras etiquetas HTML que se pueden incrustar legalmente dentro de una etiqueta de título HTML y no hay manera de integrar legalmente cualquier otra Sin embargo ... No utilice expresiones regulares para análisis de HTML en Python. Utilizar un analizador de HTML! (A menos que usted va a escribir un analizador completo, lo que sería un trabajo extra cuando varios HTML, SGML y XML analizadores ya están en las bibliotecas estándar. Si su manejo "mundo real" etiqueta de la sopa HTML (que es frecuente que no corresponden a ninguna de validación SGML / XML) es válida la BeautifulSoup paquete. No está en las librerías estándar (aún), pero se recomienda amplia para este propósito. Otra opción es: lxml ... que está escrito para correctamente estructurados (normas conformes) HTML. Pero tiene una opción para replegará para usar como un analizador BeautifulSoup:. ElementSoup