基于WHATWG HTML规范的HTML解析器
项目描述
html5lib是一个纯Python库,用于解析HTML。它旨在符合所有主要网页浏览器实现的WHATWG HTML规范。
用法
简单用法遵循以下模式
import html5lib
with open("mydocument.html", "rb") as f:
document = html5lib.parse(f)
或
import html5lib
document = html5lib.parse("<p>Hello World!")
默认情况下,document将是一个xml.etree元素实例。在可能的情况下,html5lib会选择加速的ElementTree实现(即Python 2.x上的xml.etree.cElementTree)。
还支持其他两种树类型:xml.dom.minidom和lxml.etree。要使用其他格式,请指定treebuilder的名称
import html5lib
with open("mydocument.html", "rb") as f:
lxml_etree_document = html5lib.parse(f, treebuilder="lxml")
当与 urllib2 (Python 2)一起使用时,应将HTTP的字符集传递给html5lib,如下所示
from contextlib import closing
from urllib2 import urlopen
import html5lib
with closing(urlopen("http://example.com/")) as f:
document = html5lib.parse(f, transport_encoding=f.info().getparam("charset"))
当与 urllib.request (Python 3)一起使用时,应将HTTP的字符集传递给html5lib,如下所示
from urllib.request import urlopen
import html5lib
with urlopen("http://example.com/") as f:
document = html5lib.parse(f, transport_encoding=f.info().get_content_charset())
为了更好地控制解析器,请显式创建解析器对象。例如,要使解析器在解析错误时引发异常,请使用
import html5lib
with open("mydocument.html", "rb") as f:
parser = html5lib.HTMLParser(strict=True)
document = parser.parse(f)
当您显式实例化解析器对象时,将树构建器类作为 tree 关键字参数传递以使用替代文档格式
import html5lib
parser = html5lib.HTMLParser(tree=html5lib.getTreeBuilder("dom"))
minidom_document = parser.parse("<p>Hello World!")
更多文档可在 https://html5lib.readthedocs.io/ 查找。
安装
html5lib 支持CPython 2.7+、CPython 3.5+ 和 PyPy。要安装
$ pip install html5lib
目标是支持pip支持的版本的非严格超集。
可选依赖
以下第三方库可以用于附加功能
lxml 在CPython下作为树格式(用于构建和遍历)受支持(但在PyPy下不受支持,因为它已知会导致段错误);
genshi 有一个树遍历器(但没有构建器);
chardet 可用于在无法确定字符编码时作为后备方案。
错误
请在 问题跟踪器 上报告任何错误。
测试
单元测试需要 pytest 和 mock 库,并且可以在根目录中使用 py.test 命令运行。
测试数据包含在单独的 html5lib-tests 仓库中,并作为子模块包含,因此对于git检查输出,它们必须初始化
$ git submodule init $ git submodule update
如果您在系统上拥有所有兼容的Python实现,可以使用PyPI上的 tox 工具在所有这些上运行测试。
有问题吗?
在Google Groups上有一个邮件列表可供支持,html5lib-discuss,尽管您可能通过在irc.freenode.net的#whatwg上的IRC提问而得到更快的回复。
变更日志
1.1
未发布
破坏性更改
停止支持Python 3.3。(#358)
停止支持Python 3.4。(#421)
弃用
弃用 html5lib 清理器(html5lib.serialize(sanitize=True) 和 html5lib.filters.sanitizer)。我们建议用户迁移到 Bleach <https://github.com/mozilla/bleach>。如果Bleach不足以满足您的需求,请告诉我们。(#443)
其他更改
尝试从 collections.abc 导入以删除DeprecationWarning并确保 html5lib 在未来的Python版本中继续工作。(#403)
删除可选的 datrie 依赖。(#442)
1.0.1
发布于2017年12月7日
破坏性更改
停止支持Python 2.6。(#330)(感谢,Hugo,Will Kahn-Greene!)
删除 utils/spider.py。(#353)(感谢,Jon Dufresne!)
特性
改进文档。(#300,#307)(感谢,Jon Dufresne,Tom Most,Will Kahn-Greene!)
添加iframe seamless布尔属性。(感谢,Ritwik Gupta!)
添加itemscope作为布尔属性。(#194)(感谢,Jonathan Vanasco!)
支持Python 3.6。(#333)(感谢,Jon Dufresne!)
添加使用AppVeyor的Windows CI支持。(感谢,John Vandenberg!)
改进测试和CI并添加代码覆盖率(#323,#334),(感谢,Jon Dufresne,John Vandenberg,Sam Sneddon,Will Kahn-Greene!)
符合Semver的版本号。
错误修复
支持setuptools < 18.5以支持环境标记。(感谢,John Vandenberg!)
明确依赖six >= 1.9。(感谢,Eric Amorde!)
修复正则表达式以与Python 3.7正则表达式调整兼容。(#318, #379)(感谢,Benedikt Morbach,Ville Skyttä,Mark Vasilkov!)
修复alphabeticalattributes过滤器命名空间错误。(#324)(感谢,Will Kahn-Greene!)
在生成的wheel包中包含许可文件。(#350)(感谢,Jon Dufresne!)
修复annotation-xml中的typo。(#339)(感谢,Will Kahn-Greene!)
允许在CSS颜色检查中包含大写十六进制字符。(感谢,Komal Dembla,Hugo!)
1.0
2017年12月7日发布和未发布。发布版本打包不良。
0.999999999/1.0b10
2016年7月15日发布
修复属性顺序问题,使其从树构建器到文档顺序,而不是反向文档顺序(!)。
0.99999999/1.0b9
2016年7月14日发布
在Python 2.6中将ordereddict添加为强制依赖项。
添加了lxml、genshi、datrie、charade和所有基于特定解释器实现的正确行为的外部依赖项。
现在要求测试套件依赖于mock包。
停止支持PyPy下的DATrie。
移除PullDOM支持,因为这个功能从未经过适当的测试,完全无法工作,并且据我所知,没有人使用过。
将测试套件移动到py.test。
修复#124:使用webencodings解码输入字节流;这使得html5lib符合编码标准,并引入了对webencodings的依赖。
停止支持Python 3.2(包括CPython和PyPy形式)。
修复与lxml 3.5及以上版本兼容的双破折号注释。
默认禁用脚本(因为我们没有实现脚本)。
修复#11,避免序列化器允许在旧浏览器版本中逃逸属性值可能导致的XSS漏洞;将序列化器的quote_attr_values选项更改为以下三个值之一:“always”(旧的True值)、“legacy”(新的选项,也是新的默认值)和“spec”(旧的False值,也是旧的默认值)。
通过重写sanitizer以仅应用于treewalkers(而不是tokenizer)来修复#72;因此,这将需要修改所有调用者以通过treewalker API使用它。
由于chardet再次得到支持,现在不再支持charade。
将parse和相关方法中的charset关键字参数替换为一组关键字参数:override_encoding、transport_encoding、same_origin_parent_encoding、likely_encoding和default_encoding。
将filters._base、treebuilder._base和treewalkers._base移动到.base以明确它们的状态为公开。
删除sanitizer包。将sanitizer.sanitize合并到sanitizer.htmlsanitizer模块中,并将其移动到sanitizer。这意味着使用sanitizer.sanitize或sanitizer.HTMLSanitizer的人不需要修改代码。
将treewalkers.lxmletree重命名为.etree_lxml,将treewalkers.genshistream重命名为.genshi以保持一致的API。
将大量内容(inputstream、ihatexml、trie、tokenizer、utils)移动到下划线前缀,以明确它们的状态为私有。
0.9999999/1.0b8
2015年9月10日发布
修复#195:修复sanitizer以删除损坏的URL(在0.9999和0.999999之间抛出异常)。
0.999999/1.0b7
2015年7月7日发布
修复#189:修复sanitizer以再次允许相对URL(如0.9999/1.0b5之前那样)。
0.99999/1.0b6
2015年4月30日发布
修复#188:修复sanitizer以在清理无效数据URL时不会抛出异常。
0.9999/1.0b5
2015年4月29日发布
修复#153:Sanitizer未能将一些属性视为URL。尽管听起来如此,但这没有已知的安全影响。没有已知的IE(5.5到当前)、Firefox(3到当前)、Safari(6到当前)、Chrome(1到当前)或Opera(12到当前)版本将运行这些属性中提供的任何脚本。
在严格解析模式下,将错误信息传递给 ParseError 异常。
在清理器中允许数据 URI,并具有内容类型的白名单。
添加对不支持孤残符的 Python 实现的支持(即 Jython)。修复 #2。
删除错误信息的本地化。这个功能完全未被使用(并且未测试是否可以本地化),因此我们可以像许多浏览器一样不支持翻译技术字符串。
公开 treewalkers.pprint 作为公共 API。
为 HTML5Parser 添加 documentEncoding 属性,修复 #121。
0.999
发布于 2013 年 12 月 23 日
修复 #127:为 CPython 问题 #20007 添加解决方案:http.client.HTTPResponse 的 .read(0) 丢弃剩余的内容。
修复 #115:在 Python 2 中,lxml treewalker 现在可以处理根级别包含非 ASCII 字符的文本节点的片段。
0.99
发布于 2013 年 9 月 10 日
从 1.0b3 版本以来没有库更改;作为 0.99 版本发布,因为 pip 已从 1.4 版本开始更改行为,避免根据 PEP 440 安装预发布版本。
1.0b3
发布于 2013 年 7 月 24 日
从 treewalkers._base 中移除了 RecursiveTreeWalker。任何使用它的实现都应该移动到 NonRecursiveTreeWalker,因为 html5lib 捆绑的所有内容多年来都是这样做的。
修复 #67,使 BufferedStream 正确返回一个字节对象,从而修复了 html5lib 接收非可寻址的 RawIOBase-like 对象的任何情况。
1.0b2
发布于 2013 年 6 月 27 日
删除了序列化器内属性的重新排序。现在有一个 alphabetical_attributes 选项,通过新的过滤器保留了以前的行为。这允许在树构建器保留顺序的情况下,通过 html5lib 保留属性顺序。
从 DOM 树构建器中删除了 dom2sax。它已被 treeadapters.sax.to_sax 替换,这是一个通用的实现,支持任何 treewalker;它还解决了 dom2sax 的所有已知错误。
修复了在 Python 2 中遇到字节字符串时的 treewalker 断言。在 1.0b1 之前,treewalker 可以处理 Python 2 中的混合字节/unicode 数据;现在在 Python 2 中重新引入了这种行为。Python 3 中的行为未改变。
1.0b1
发布于 2013 年 5 月 17 日
实现更新,以实现 2013 年 5 月 5 日(SVN 修订版 r7867)的 HTML 规范。
使用 six 库在单个代码库中支持 Python 3.2+。
移除了对 Python 2.5 及更早版本的支持。
移除了已弃用的 Beautiful Soup 3 树构建器。 beautifulsoup4 可以使用 html5lib 作为解析器。注意,由于它不支持命名空间,因此 SVG 和 MathML 等外部内容将无法正确解析。
从包中移除了 simpletree。默认树构建器现在是 etree(如果可用,使用 xml.etree.cElementTree 实现,否则使用 xml.etree.ElementTree)。
移除了 XHTMLSerializer,因为它从未真正保证其输出是有效的 XML,因此几乎没有任何用途。
移除了默认 DOM 树构建器,因此 html5lib.treebuilders.dom 不再受支持。 html5lib.treebuilders.getTreeBuilder("dom") 将返回默认 DOM 树构建器,它使用 xml.dom.minidom。
基于 charade 的可选字符编码检测现在与 Python 2.6 - 3.3 兼容。
修复了可选的 Genshi treewalker 支持。
许多错误修复,包括
#33:属性值中的 null 会破坏 XML AttValue;
#4:嵌套的、间接后代的 <button> 会导致无限循环;
Google Code 215:正确检测可寻址流;
Google Code 206:添加对 <video preload=…>、<audio preload=…> 的支持;
Google Code 205:添加对 <video poster=…> 的支持;
Google Code 202:Unicode 文件导致 InputStream 出错。
源代码现在大部分符合 PEP 8 规范。
测试工具已改进,现在依赖于 nose。
文档已更新并移至 https://html5lib.readthedocs.io/。
0.95
发布于 2012 年 2 月 11 日
0.90
发布于 2010 年 1 月 17 日
0.11.1
发布于 2008 年 6 月 12 日
0.11
发布于 2008 年 6 月 10 日
0.10
发布于 2007 年 10 月 7 日
0.9
发布于 2007 年 3 月 11 日
0.2
发布于 2007 年 1 月 8 日
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源代码分发
构建分发
html5lib-1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f |
|
MD5 | 6748742e2ec4cb99287a6bc82bcfe2b0 |
|
BLAKE2b-256 | acb6b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2 |
html5lib-1.1-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d |
|
MD5 | 167ff642c4754015d78b21117a752342 |
|
BLAKE2b-256 | 6cdda834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028 |