我正在尝试(或计划尝试)编写一个简单(尽可能)的程序来将html文档解析成树。
在谷歌搜索之后,我发现很多答案说“不要这样做”(或者说这样的话);并引用HTML解析器的例子;也是一个非常强调的文章,为什么不应该使用正式表达。但是我没有找到任何指导,以“正确”的方式写一个解析器。 (顺便说一句,我正在尝试更多的是一种学习风格,而不是任何事情,所以我很想做,而不是使用一个预制的)
我相信只要读取文档并将标签/文本等添加到树中,我就可以制作一个工作的XML解析器,只要我打了一个关闭标签(再次简单,没有花哨的线程或这个阶段需要的效率) )。但是,对于HTML并不是所有的标签都关闭。
所以我的问题是这样的:你会推荐什么来处理这个问题?我唯一的想法是以类似于XML的方式对待它,但是有一个标签的列表,这些标签不一定要关闭,每个都有关闭的条件(例如< p>结束于< / p>或下一个< p>标签)。
有谁有任何其他(希望更好)的建议?有没有更好的方式这样做?
解决方法
所以我会在这里尝试一个答案 –
基本上,什么使得“简单”html解析(不涉及这里的有效xhtml)与xml解析不同是诸如永无止境的< img>标签之类的规则的加载,或严格地说,即使是所有html标记中最高的将在浏览器中进行渲染。
您将需要一个验证器以及解析器来构建您的树。但是,您必须确定要支持的HTML标准,以便当您遇到标记的弱点时,您会知道这是一个错误,而不仅仅是一个拙劣的HTML。
知道所有的规则,构建一个验证器,然后你就可以构建一个解析器。这是计划A.
计划B将会在您的解析器中允许一定的错误阻力,这将使验证步骤不必要。例如,解析所有标签,并将其放在列表中,省略任何属性,以便您可以轻松地在列表上操作,确定标签是否保持打开状态,或者始终未打开,最终获得“好” “布局树,这将是粗略布局的一个近似解决方案,同时准确地正确布局。
希望有所帮助!