Как обнаружить с помощью 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")