如果字符串包含html代码,如何用python检测?

sta*_*tic 18 html python parsing detect

如何检测字符串中是否包含一个html(可以是html4,html5,只是部分文本中的html)?我不需要HTML的版本,而是如果字符串只是一个文本或它包含一个HTML.文本通常是多行,也是空行

更新:

示例输入:

HTML:

<head><title>I'm title</title></head>
Hello, <b>world</b>
Run Code Online (Sandbox Code Playgroud)

非HTML:

<ht fldf d><
<html><head> head <body></body> html
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 31

您可以使用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
Run Code Online (Sandbox Code Playgroud)

这基本上试图在字符串中找到任何html元素.如果找到 - 结果是True.

HTML片段的另一个例子:

>>> html = "Hello, <b>world</b>"
>>> bool(BeautifulSoup(html, "html.parser").find())
True
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用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
Run Code Online (Sandbox Code Playgroud)


Jam*_*lls 7

我想到的一种方法是通过尝试将文本解析为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
Run Code Online (Sandbox Code Playgroud)

输出:

$ python foo.py
False
True
True
Run Code Online (Sandbox Code Playgroud)

这适用于包含HTML元素子集的部分文本.

注意:这使用了html5lib,因此它可能不适用于其他文档类型,但该技术可以轻松调整.


And*_*son -4

检查结束标签。我认为这是最简单且最强大的。

"</html>" in possibly_html
Run Code Online (Sandbox Code Playgroud)

如果有结束 html 标签,那么它看起来像 html,否则就不太像。