Как обнаружить с помощью python, если строка содержит html-код?

Как определить, содержит ли строка строку html (может быть html4, html5, только частичные части html в тексте)? Мне не нужна версия HTML, но если строка - это просто текст или содержит html. Текст обычно многострочный, а также пустые строки

Update:

пример ввода:

HTML:

<head><title>I'm title</title></head>
Hello, <b>world</b>

не-HTML:

<ht fldf d><
<html><head> head <body></body> html

Ответ 1

Вы можете использовать парсер HTML, например BeautifulSoup. Обратите внимание, что он действительно пытается лучше разобрать HTML, даже сломанный HTML, он может быть очень и не очень мягким в зависимости от основного анализатора:

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

Это в основном пытается найти любой элемент html внутри строки. Если найдено - результат True.

Другой пример с фрагментом HTML:

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

В качестве альтернативы вы можете использовать lxml.html:

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

Ответ 2

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

Пример:

#!/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("<p>Hello World!</p>"))
print(is_html("<html><head><title>Title</title></head><body><p>Hello!</p></body></html>"))  # noqa

Вывод:

$ python foo.py
False
True
True

Это работает для частичного текста, который содержит подмножество элементов HTML.

NB: Это использует html5lib, поэтому он может не работать для других типов документов, но обязательно технику можно легко адаптировать.

Ответ 3

Проверить окончания тегов. Это самый простой и самый надежный, я считаю.

"</html>" in possibly_html

Если есть конечный html-тег, то он выглядит как html, в противном случае не так много.

Ответ 4

Продолжая предыдущий пост, я бы сделал что-то подобное для чего-то быстрого и простого:

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 == "</html>"
            ishtml = True
    if ishtml:
        print("This is an html file")
    else:
        print("This is not an html file")