跳转到主要内容

基于WHATWG HTML规范的HTML解析器

项目描述

https://travis-ci.org/html5lib/html5lib-python.svg?branch=master

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.minidomlxml.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 可用于在无法确定字符编码时作为后备方案。

错误

请在 问题跟踪器 上报告任何错误。

测试

单元测试需要 pytestmock 库,并且可以在根目录中使用 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 (272.2 kB 查看哈希值)

上传日期 源代码

构建分发

html5lib-1.1-py2.py3-none-any.whl (112.2 kB 查看哈希值)

上传日期 Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面