问题标签 [html5lib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
97 浏览

beautifulsoup - BeautifulSoup html5lib 解析奇怪现象..这是一个错误吗?

python2.6 + htmllib0.99 + bs4

运行以下代码时会抛出异常

去掉“<title>”和“test”之间的空格后,程序运行成功

0 投票
1 回答
1081 浏览

python - 使用 html5lib 将任何 HTML 解析为 XML

我需要整理 HTML 页面并在 Python 中将它们转换为 XML;如果需要,丢失一些“坏”部分。

我用了一段时间的TagSoup,但是它不理解新的“文章”、“页脚”标签,并且不喜欢不在头部的“元”;使生成的 XML 几乎无法处理。

到目前为止,我喜欢html5lib所做的事情,但是我的第五次测试(非常奇怪的测试)失败了;解析时

使用 html5lib + xml.dom treebuilder,我在生成的 XML 字符串中得到以下内容:

对于格式良好的 xml,这不是一个好的结果。

当我尝试将 html5lib + lxml作为树生成器时,我将其转换为

哪个更好,但问题是lxml “吃掉”标签的结束标签/斜线<link>,使它们仅<link ... >在输出 XML 时。

你会推荐使用什么?

0 投票
2 回答
2510 浏览

python - BeautifulSoup 找不到正确解析的元素

BeautifulSoup用来解析一堆可能非常脏的HTML文档。我偶然发现了一件非常奇怪的事情。

HTML 来自此页面:http ://www.wvdnr.gov/

它包含多个错误,例如多个<html></html><title>在外部<head>等等......

但是,即使在这些情况下,html5lib 通常也能正常工作。事实上,当我这样做时:

我 pretti-print soup,我看到以下输出:http ://pastebin.com/8BKapx88

其中包含很多<a>标签。

但是,当我这样做时,soup.find_all("a")我会得到一个空列表。和lxml我一样。

那么:以前有没有人偶然发现过这个问题?到底是怎么回事?如何获取html5lib找到但未返回的链接find_all

0 投票
3 回答
1959 浏览

python - 在 Python 中解析 HTML 时获取位置信息

我正在尝试找到一种在 Python 中解析(可能格式错误)HTML 的方法,如果满足一组条件,则输出带有位置(行、列)的文档。位置信息是让我在这里绊倒的原因。需要明确的是,我不需要构建对象树。我只是想在原始文档中找到某些数据及其位置(想想拼写检查器,例如:'word "foo" at line x, column y, is拼写错误)'

作为一个例子,我想要这样的东西(使用 ElementTree 的Target API):

但是,据我所知,该getpos()方法(或类似方法)不存在。当然,那是使用 XML 解析器。我想解析可能格式错误的 HTML。

有趣的是,Python 标准库中的HTMLParser类确实提供了对获取位置信息(使用getpos()方法)的支持,但它在处理格式错误的 HTML 时非常糟糕,并且已作为可能的解决方案被淘汰。我需要在不破坏解析器的情况下解析真实单词中存在的 HTML。

我知道有两个 HTML 解析器可以很好地解析格式错误的 HTML,即lxmlhtml5lib。事实上,我更愿意使用其中任何一个,而不是 Python 中可用的任何其他选项。

但是,据我所知,html5lib 不提供事件 API,并且需要将文档解析为树对象。然后我将不得不遍历树。当然,到那时,与源文档没有关联,所有位置信息都丢失了。所以,html5lib 出来了,这很可惜,因为它似乎是处理格式错误的 HTML 的最佳解析器。

lxml 库提供了一个 Target API,它主要反映 ElementTree 的,但同样,我不知道有任何方法可以访问每个事件的位置信息。看一眼源代码也没有提供任何提示。

lxml 还为 SAX 事件提供了一个 API。有趣的是,Python 的标准库提到 SAX 支持Locator Objects,但几乎没有提供有关如何使用它们的文档。这个SO Question提供了一些信息(使用 SAX 解析器时),但我看不出这与 lxml 提供的对 SAX 事件的有限支持有何关系。

最后,在有人建议Beautiful Soup之前,我要指出,正如主页上所述,“Beautiful Soup 位于流行的 Python 解析器(如 lxml 和 html5lib)之上”。它给我的只是一个从中提取数据的对象,与原始源文档没有任何联系。与 html5lib 一样,当我访问数据时,所有位置信息都会丢失。我想要/需要直接访问解析器。

为了扩展我在开头提到的拼写检查器示例,我只想检查文档文本中单词的拼写(而不是标签名称或属性),并且可能希望跳过检查特定标签的内容(如脚本或代码标签)。因此,我需要一个真正的 HTML 解析器。但是,在报告拼写错误时,我只对原始源文档中拼写错误的位置感兴趣,不需要构建树对象。需要明确的是,这只是一种潜在用途的示例。我可能会将它用于完全不同的东西,但需求基本相同。事实上,我曾经使用 HTMLParser 构建过非常相似的东西,但从未使用过它,因为错误处理不适用于该用例。那是几年前的事了 而且我似乎在某处丢失了该文件。这次我想改用 lxml 或 html5lib。

那么,有什么我想念的吗?我很难相信这些解析器(除了最没用的 HTMLParser 之外)没有任何方法可以访问位置信息。但如果他们这样做,它必须是无证的,这对我来说似乎很奇怪。

0 投票
2 回答
592 浏览

python - 使用 html5lib 验证 HTML 片段

我正在使用 Python 和html5lib来检查在表单字段中输入的一些 HTML 代码是否有效。

我尝试了下面的代码来测试一个有效的片段,但我得到了一个意外的错误(至少对我来说):

我做错了什么?

我的默认编码是utf-8

0 投票
1 回答
73 浏览

python - html5lib 是否容易受到恶意输入的影响?

Python 的XML 处理模块文档列出了其 XML 处理模块中的漏洞。我会假设 html5lib 遵循 HTML5 规范(除了未知错误),因此不会同样容易受到恶意输入的攻击,但我讨厌做出假设,也找不到关于潜在安全问题的讨论。

那么有什么我应该注意的安全问题吗?或者使用它来解析恶意构造的html是否安全?

0 投票
1 回答
588 浏览

django - 使 Django 模型表单安全

我正在构建一个高性能 API。我已经使用 Tastypie 多年了,有时我只需要更简单。对于这个 API,我决定使用 Django Simple Rest ( https://github.com/croach/django-simple-rest )。它提供了所需的基础,我可以使用表单和 ORM 来验证和保存数据,而无需通用 API 库开销。

我想验证传入的数据。我正在使用模型表单来执行此操作。它既好又简单,它可以根据模型验证数据,但我需要更多。

我想确保没有脚本或 HTML 被发布。对于某些字段,我可能允许使用 HTML。我知道我可以使用 html5lib 进行各种验证,我可能会,但我看到的唯一示例是您指定每个字段的地方。我正在尝试找出一种方法来默认防止将 javascript 或 HTML 输入到字段中并能够根据需要进行覆盖。我不想用表格来描述每个模型,我想要一些通用的东西。

这是我最简单的 put 函数。

这是我的表格。

如果我想接受 HTML,那么为我的所有 put 方法和表单提供通用保护并能够覆盖行为的最佳方法是什么。

我感谢您的帮助!

富有的

0 投票
2 回答
591 浏览

python - Html5在页面python中查找/解析特定元素

我正在尝试学习如何从 html5 网页中查找/解析数据以在数据库中使用。我想学习如何仅从第一个中查找/解析数据'//div[@class="col-xs-12 col-sm-6 col-md-4 col-lg-3"]'

我已经尝试过 html5lib,从 lxml 导入 html 和 xpath,但是缺少针对我的特定用途的文档令人沮丧,我真的找不到如何实现这一点。

要查找和存储的数据:

我正在尝试学习的 html 代码

0 投票
1 回答
353 浏览

html - lxml html5parser 忽略“namespaceHTMLElements=False”选项

lxml html5parser似乎忽略namespaceHTMLElements=False了我传递给它的任何选项。它将我给它的所有元素放入 HTML 命名空间,而不是(预期的)void 命名空间。

这是一个重现问题的简单案例:

输出是这样的:

可以看出,html元素和所有其他元素都在 HTML 命名空间中。

预期的输出是这样的:

我认识到这namespaceHTMLElements是一个 html5lib 选项,而不是 lxml 直接执行任何操作的本机 lxml 选项。lxml 应该只调用 html5lib 并将该选项传递给 html5lib,以便 html5lib 按预期使用它。


2016-02-17 更新

我仍然没有找到让 lxml html5parser 尊重namespaceHTMLElements. 但需要明确的是,替代方法是直接调用 html5lib,如下所示:


更多细节

我已经知道的一些事情:

  • html5lib 完全符合 HTML 规范的要求,包括html元素必须放在 HTML 命名空间中的要求——html5lib 就是这样做的
  • 但是,html5lib 提供namespaceHTMLElements=False了一个选项来覆盖默认的“将html元素放入 HTML 命名空间”行为。
  • 当我直接使用 html5lib(而不是通过 lxml)并将其传递namespaceHTMLElements=False给它时,一切都按预期工作 -html元素进入 void 命名空间。
  • 将一些 printf 破解到 html5lib 源代码中,我观察到:

    • lxml实际上namespaceHTMLElements=False是按预期调用 html5lib
    • 但是,lxml 似乎两次调用 html5lib :第一次没有namespaceHTMLElements,然后第二次使用namespaceHTMLElements=False

关于在哪里找到原因的结论

综上所述,很明显问题出在 lxml 和 html5lib 之间的接口上。我不确定为什么 lxml 两次调用 html5lib 但我认为这可能是因为出于某种原因它首先尝试创建自己的新实例,XHTMLParser然后再执行我实际要求它执行的操作,这只是创建它自己的一个实例HTMLParser

因此,它确实对 html5lib 进行了两次调用这一事实可能会导致 html5lib 对namespaceHTMLElements=True第一次调用产生的默认行为进行排序,然后namespaceHTMLElements=False在第二次调用中看到该指令时忽略该指令。

也许在以它的方式进行两次调用时,lxml 要么打破了 html5lib 中的某些假设,要么实际上以一种设计上不打算使用的方式滥用 html5lib API。

或者,原因可能根本不是 lxml 对 html5lib 进行两次单独调用的结果,而是它使用 html5lib 接口的方式存在其他问题。

无论如何,我很想听听其他人是否有其他人遇到过这个问题并有解决方法——或者至少对它发生的原因有一些了解。

0 投票
1 回答
807 浏览

lxml - 将 lxml _Element 转换为 HtmlElement

由于各种原因,我试图从 切换lxml.html.fromstring()lxml.html.html5parser.document_fromstring(). 两者最大的区别是第一个返回一个lxml.html.HtmlElement,第二个返回一个lxml.etree._Element

大多数情况下这是可以的,但是当我尝试使用该_Element对象运行我的代码时,它崩溃了,说:

这是有道理的。我的问题是,处理这个问题的最佳方法是什么。我有很多需要 HtmlElements 的代码,所以我认为最好的解决方案是转换为那些。我不确定这是否可能。

更新

一个糟糕的解决方案如下所示:

显然,这是相当蛮力的,但它确实有效。我能够得到一个由 html5parser 解析的 HtmlElement,这就是我所追求的。

另一种选择是弄清楚如何执行我所依赖的 rewrite_links 和 xpath 查询,但_Elements 似乎没有该功能(这又是有道理的!)