文字列にhtmlが含まれていることを検出する方法(html4、html5、テキスト内のhtmlの一部のみ)は? HTMLのバージョンは必要ありませんが、文字列が単なるテキストであるか、HTMLが含まれている場合は必要です。テキストは通常複数行で、行も空です
入力例:
html:
<head><title>I'm title</title></head>
Hello, <b>world</b>
非HTML:
<ht fldf d><
<html><head> head <body></body> html
BeautifulSoup
のようなHTMLパーサーを使用できます。 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
私が考えた方法の1つは、テキストを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 を使用するため、他の種類のドキュメントでは必ずしも機能しない可能性がありますが、この手法は簡単に適応できます。