浏览器如何解析 HTML?

浏览器如何解析 HTML?,第1张

浏览器渲染引擎从网络层取得请求的文档,一般情况下文档会分成 8KB 大小的分块传输。

HTML 解析器的主要工作是对 HTML 文档进行解析,生成解析树。

解析树是以 DOM 元素以及属性为节点的树。DOM 是 文档对象模型(Document Object Model) 的缩写,它是 HTML 文档的对象表示,同时也是 HTML 元素面向外部(如 JavaScript)的接口。树的根部是 Document 对象。整个 DOM 和 HTML 文档几乎是一对一的关系。

解析算法

HTML 不能使用常见的自顶向下或自底向上方法来进行分析。主要原因有以下几点:

由于不能使用常用的解析技术,浏览器创造了专门用于解析 HTML 的解析器。解析算法在 HTML5 标准规范中有详细介绍,算法主要包含了两个阶段: 标记化(tokenization)和树的构建

解析结束之后

浏览器开始加载网页的外部资源(CSS,图像,JavaScript 文件等)。

此时浏览器把文档标记为 可交互的(interactive) ,浏览器开始解析处于 推迟(deferred) 模式的脚本,也就是那些需要在文档解析完毕之后再执行的脚本。之后文档的状态会变为 完成(complete) ,浏览器会触发 加载(load) 事件。

注意解析 HTML 网页时永远不会出现 无效语法(Invalid Syntax) 错误,浏览器会修复所有错误内容,然后继续解析。

解析HTML最好的类还是微软自己的在站内搜索的项目要进行HTML的解析,发现程序运行非常慢,一开始以为是lucene的问题,一测试大吃一惊,每一步lucene中AddDocument等只用了几十毫秒,而HTML解析竟然用了9秒。日志如下:2010-06-26 15:51:25,171 [8] DEBUG SearchSite.StartIndex - DownloadString:00:00:00.04823292010-06-26 15:51:34,187 [8] DEBUG SearchSite.StartIndex - ThreadParser:00:00:09.02364902010-06-26 15:51:34,187 [8] DEBUG SearchSite.StartIndex - DeleteDocuments:00:00:00.00000692010-06-26 15:51:34,203 [8] DEBUG SearchSite.StartIndex - AddDocument:00:00:00.0191071我使用的是Winista.HtmlParser这块网上找到的HTML解析器。遂准备更换解析器,但是用“.Net HTML Parser”在google上寻找,一直没找到合适的解析器,不是太难用,就是性能比Winista.HtmlParser还差,我才想到,微软的MSHTML不就是用来解析HTML的吗?折腾这么一圈却忘了微软自家的东西,微软的东西性能肯定差不了。添加对Microsoft.mshtml这个程序集的引用,然后编写如下代码:IHTMLDocument2 doc = new HTMLDocumentClass() doc.write(new object[]{pageSource}) doc.close() Title = doc.title Body = doc.body.innerText再测试,哇咔咔,快的要命,只有几十毫秒,2000个帖子一会儿就爬完了。日志如下:2010-06-26 16:26:35,546 [8] DEBUG SearchSite.StartIndex - DownloadString:00:00:00.04002632010-06-26 16:26:35,562 [8] DEBUG SearchSite.StartIndex - ThreadParser:00:00:00.02577312010-06-26 16:26:35,562 [8] DEBUG SearchSite.StartIndex - DeleteDocuments:00:00:00.00019132010-06-26 16:26:35,578 [8] DEBUG SearchSite.StartIndex - AddDocument:00:00:00.0010881HTMLDocumentClass的方法比任何一个网上找到的HTML解析器都丰富,想怎么搞就怎么搞,而且调用方法就是 *** 作Dom的方法,完全不用再去学,哇咔咔,爽呆了。在使用的过程中遇到两个问题:1、VS2010中引用Microsoft.mshtml之后,要修改这个引用的“嵌入互 *** 作类型”为False。2、调用doc.write方法的时候必须通过IHTMLDocument2接口来调用,否则报错“错误的类型”,在google上搜“type mismatch HTMLDocument write”


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6143723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-16
下一篇 2023-03-16

发表评论

登录后才能评论

评论列表(0条)

保存