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)
我想到的一种方法是通过尝试将文本解析为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,否则就不太像。