web-dev-qa-db-ja.com

pythonで文字列にHTMLコードが含まれている場合に検出する方法は?

文字列に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
20
static

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
31
alecxe

私が考えた方法の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 を使用するため、他の種類のドキュメントでは必ずしも機能しない可能性がありますが、この手法は簡単に適応できます。

7
James Mills