基于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元素实例。尽可能使用加速的ElementTree实现(即Python 2.x上的xml.etree.cElementTree)。
支持两种其他树类型:xml.dom.minidom和lxml.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 可以在无法确定字符编码时作为后备使用。
错误
请将任何错误报告到问题跟踪器。
测试
单元测试需要 pytest 和 mock 库,并且可以使用根目录下的 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 的强制依赖项。
添加了 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 以仅应用于 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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c4ea3de7615dc8dc373b386db4f0e839e16f56c66afe68933313d76fb469240a |
|
MD5 | e54026387fa2467ae10562314dac7a12 |
|
BLAKE2b-256 | d2b14835c1b9e9b2e20e87758439ddb4e8b7cbe07235b5eea60858816e3021df |
html5-0.0.9-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0dcc8ab9a80924817c52c6fdcb7f2d3d22ae0977604f361731f11bc01c015a37 |
|
MD5 | 2ddd943f8f33308aadaca1784323ca78 |
|
BLAKE2b-256 | e651431cc45b61c668e26f406405878a86f7c537864426368210249bf9bed515 |