gpt4 book ai didi

html - 编写 HTML 解析器

转载 作者:技术小花猫 更新时间:2023-10-29 11:49:18 26 4
gpt4 key购买 nike

我目前正在尝试(或计划尝试)编写一个简单(尽可能)的程序来将 html 文档解析为树。

谷歌搜索后,我发现很多答案都说“不要做,它已经完成了”(或类似的话);以及对 HTML 解析器示例的引用;还有一篇关于为什么不应该使用正则表达式的相当强调的文章。但是我还没有找到任何关于编写解析器的“正确”方法的指南。 (顺便说一句,这是我更多地尝试作为学习练习而不是任何东西,所以我很想这样做而不是使用预制的)

我相信我可以通过阅读文档并将标签/文本等添加到树中来创建一个工作的 XML 解析器,每当我点击一个关闭标签时提升一个级别(同样,简单,不需要花哨的线程或效率在这个阶段。)。然而,对于 HTML 而言,并不是所有的标签都是封闭的。

所以我的问题是:您会推荐什么方法来处理这个问题?我唯一的想法是以与 XML 类似的方式对待它,但有一个标签列表,这些标签不一定关闭,每个标签都有关闭条件(例如

结束于

或下一个

标签)。

还有其他(希望更好的)建议吗?有没有更好的方法来完全做到这一点?

最佳答案

HTML 的松散性可以通过根据需要找出缺少的打开和关闭标记来解决。这基本上就是像 tidy 这样的验证器所做的。

您将保留当前上下文的堆栈(可能隐含地与树一起)。例如,{ <html> , <body> } 表示您当前位于 html 文档的正文中。当您遇到一个新节点时,您将该节点的要求与堆栈中当前的要求进行比较。

假设您的堆栈目前只有 { html }.你遇到一个 <p>标签。你查查<p>在一个告诉你段落必须在 <body> 内的表格中.因为你不在 body 里,所以你隐含地推 <body>到你的堆栈上(或将一个正文节点添加到你的树中)。然后你可以把<p>进入树中。

现在假设您看到另一个 <p> .你的规则告诉你你不能在一个段落中嵌套一个段落,所以你知道你必须弹出当前的 <p>在将新段落插入堆栈之前离开堆栈(就像您看到了一个关闭标记一样)。

在文档的末尾,您将每个剩余的元素从堆栈中弹出,就好像您已经看到每个元素的关闭标记一样。

诀窍是找到一种好方法来表示每个元素的上下文要求。

关于html - 编写 HTML 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7192101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com