¿Cómo detectar con Python si la cadena contiene código html?

¿Cómo detectar si la cadena contiene un html (puede ser html4, html5, solo parciales de html dentro del texto)? No necesito una versión de HTML, sino que si la cadena es solo un texto o contiene un html. El texto es típicamente multilínea con líneas también vacías

Actualizar:

entradas de ejemplo:

html:

I'm title Hello, world 

no html:

 <  head  html 

Puedes usar un analizador de HTML, como BeautifulSoup . Tenga en cuenta que realmente lo mejor es analizar un HTML, incluso un HTML roto, puede ser muy indulgente según el analizador subyacente :

 >>> from bs4 import BeautifulSoup >>> html = """ ... I'm title ... """ >>> non_html = "This is not an html" >>> bool(BeautifulSoup(html, "html.parser").find()) True >>> bool(BeautifulSoup(non_html, "html.parser").find()) False 

Esto básicamente intenta encontrar cualquier elemento html dentro de la cadena. Si se encuentra, el resultado es True .

Otro ejemplo con un fragmento HTML:

 >>> html = "Hello, world" >>> bool(BeautifulSoup(html, "html.parser").find()) True 

Alternativamente, puedes usar lxml.html :

 >>> import lxml.html >>> html = 'Hello, world' >>> non_html = "<" >>> lxml.html.fromstring(html).find('.//*') is not None True >>> lxml.html.fromstring(non_html).find('.//*') is not None False 

Una forma en la que pensé fue cruzar las tags de inicio y fin encontradas al intentar analizar el texto como HTML e intersectar este conjunto con un conjunto conocido de elementos HTMl aceptables.

Ejemplo:

 #!/usr/bin/env python from __future__ import print_function from HTMLParser import HTMLParser from html5lib.sanitizer import HTMLSanitizerMixin class TestHTMLParser(HTMLParser): def __init__(self, *args, **kwargs): HTMLParser.__init__(self, *args, **kwargs) self.elements = set() def handle_starttag(self, tag, attrs): self.elements.add(tag) def handle_endtag(self, tag): self.elements.add(tag) def is_html(text): elements = set(HTMLSanitizerMixin.acceptable_elements) parser = TestHTMLParser() parser.feed(text) return True if parser.elements.intersection(elements) else False print(is_html("foo bar")) print(is_html("

Hello World!

")) print(is_html("Title

Hello!

")) # noqa

Salida:

 $ python foo.py False True True 

Esto funciona para texto parcial que contiene un subconjunto de elementos HTML.

NB: Esto hace uso de html5lib por lo que puede no funcionar necesariamente para otros tipos de documentos, pero la técnica se puede adaptar fácilmente.

Compruebe si hay tags de finalización. Esto es lo más simple y más robusto que creo.

 "" in possibly_html 

Si hay una etiqueta html final, entonces parece html, de lo contrario no tanto.

Ampliando la publicación anterior, haría algo como esto para algo rápido y simple:

 import sys, os if os.path.exists("file.html"): checkfile=open("file.html", mode="r", encoding="utf-8") ishtml = False for line in checkfile: line=line.strip() if line == "" ishtml = True if ishtml: print("This is an html file") else: print("This is not an html file")