跳转到主要内容

基于WHATWG HTML规范的HTML解析器

项目描述

https://travis-ci.org/html5lib/html5lib-python.png?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元素实例。尽可能使用加速的ElementTree实现(即Python 2.x上的xml.etree.cElementTree)。

支持两种其他树类型:xml.dom.minidomlxml.etree。要使用替代格式,指定树构建器的名称

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.6+、CPython 3.3+和PyPy。要安装它,请使用

$ pip install html5lib

可选依赖

以下第三方库可用于额外功能

  • datrie 可以在 CPython 下使用,以提高解析性能(尽管在几乎所有情况下,改进都是微不足道的);

  • lxml 在 CPython 下支持作为树格式(既可用于构建也可用于遍历),但在 支持 PyPy(因为它会导致段错误);

  • genshi 有一个 treewalker(但没有构建器);并且

  • chardet 可以在无法确定字符编码时作为后备使用。

错误

请将任何错误报告到问题跟踪器

测试

单元测试需要 pytestmock 库,并且可以使用根目录下的 py.test 命令运行;在 Python 2.6 下需要 ordereddict。所有测试都应通过。

测试数据包含在单独的 html5lib-tests 存储库中,并作为子模块包含,因此对于 git 检出,它们必须被初始化

$ git submodule init
$ git submodule update

如果您在系统上拥有所有兼容的 Python 实现,您可以使用 PyPI 上的 tox 工具在所有这些上运行测试。

有问题?

Google Groups 上的 html5lib-discuss 提供了支持,但在 irc.freenode.net 上的 #whatwg 上的 IRC 上提问可能会得到更快的回复。

变更日志

0.99999999/1.0b9

发布于 2016 年 7 月 14 日

  • 将 ordereddict 添加为 Python 2.6 的强制依赖项。

  • 添加了 lxmlgenshidatriecharade 以及根据特定解释器实现执行正确操作的所有额外功能。

  • 现在需要测试套件中的 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 以仅应用于 treewalker(而不是 tokenizer)来修复 #72;因此,这将需要修正所有调用它的代码以通过 treewalker API 使用它。

  • 由于 chardet 再次得到支持,现在不再支持 charade。

  • 将解析和相关方法上的 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 模块中,并将其移动到 saniziter。这意味着使用 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:修复清理器以丢弃损坏的URL(它在0.9999和0.999999之间抛出异常)。

0.999999/1.0b7

发布于2015年7月7日

  • 修复 #189:修复清理器以再次允许相对URL(就像在0.9999/1.0b5之前所做的那样)。

0.99999/1.0b6

发布于2015年4月30日

  • 修复 #188:修复清理器,在清理无效数据URL时不再抛出异常。

0.9999/1.0b5

发布于2015年4月29日

  • 修复 #153:清理器未能将某些属性视为URL。尽管听起来是这样,但这没有已知的 security 影响。没有已知的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:lxml treewalker现在可以处理包含根级别非ASCII字符文本节点的片段,在Python 2上。

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之前,treewalkers能够处理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树遍历支持已修复。

  • 许多错误修复,包括

    • #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日

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

html5-0.0.9.tar.gz (118.9 kB 查看哈希值)

上传时间 源代码

构建分发

html5-0.0.9-py2.py3-none-any.whl (112.4 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者

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