浏览器如何解析 HTML?

html-css011

浏览器如何解析 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) 错误,浏览器会修复所有错误内容,然后继续解析。

说道URL,就要说到常用的几种协议:

http, https, ftp不用多说,

open主要用来打开打开本地的文件open://

//表示所用协议和当前页面的协议保持一致

在解析域名的过程中首先会通过以下几个方面查找是否有域名缓存:

1.浏览器缓存-浏览器会缓存DNS记录一段时间

2.系统缓存-从Hosts文件查找是否有对应的域名和和IP

Mac就是/etc/hosts文件,可以vi /etc/hosts来编辑这个文件,或者通过 Hostbuddy 软件来编辑.

3.路由器缓存

4.ISP DNS缓存-(Internet Service Provider),互联网服务提供商

5.如果以上步骤中都没有找到对应的域名,就会到根域名服务器中去寻找对应域名的IP

Ps:

这其实是省略了1~4的环节,直接使用域名服务器进行来进行域名解析

这其实是控制了DNS服务器,本来baidu.com应当是百度的域名,但是其实给你指到了别的IP上.

常见的web服务器有Apache, Nginx, IIs, Lighttpd

起到一个接收处理或者反向代理到其他服务器的作用

可以参考 web服务器和应用服务器的区别

这里主要是后台的一些处理,不多说

html字符串被浏览器一步步解析.

浏览器解析html的过程如下:

HTML解析器的工作是解析HTML标记到解析树

1)HTML语法定义

HTML的词汇与句法定义在w3c组织创建的规范中。当前版本是HTML4,HTML5的工作正在进行中。

2)不是上下文无关语法

在对解析器的介绍中看到,语法可以用类似BNF的格式规范地定义。不幸的是所有常规解析器的讨论都不适用于HTML(我提及它们并不是为了娱乐,它们可以用于解析CSS和JavaScript)。HTML无法用解析器所需的上下文无关的语法来定义。过去HTML格式规范由DTD (Document Type Definition)来定义,但它不是一个上下文无关语法。

HTML与XML相当接近。XML有许多可用的解析器。HTML还有一个XML变种叫XHTML,那么它们主要区别在哪里呢?区别在于HTML应用更加”宽容”,它容许你漏掉一些开始或结束标签等。它整个是一个“软”句法,不像XML那样严格死板。 总的来说这一看似细微的差别造成了两个不同的世界。一方面这使得HTML很流行,因为它包容你的错误,使网页作者的生活变得轻松。另一方面,它使编写语法格式变得困难。所以综合来说,HTML解析并不简单,现成的上下文相关解析器搞不定,XML解析器也不行。

3)HTML DTD

HTML的定义使用DTD文件。这种格式用来定义SGML族语言,它包含对所有允许的元素的定义,包括它们的属性和层级关系。如我们前面所说,HTML DTD构不成上下文无关语法。

DTD有几种不同类型。严格模式完全尊守规范,但其它模式为了向前兼容可能包含对早期浏览器所用标签的支持。当前的严格模式DTD:http://www.w3.org/TR/html4/strict.dtd

4)DOM

解析器输出的树是由DOM元素和属性节点组成的。DOM的全称为:Document Object Model。它是HTML文档的对象化描述,也是HTML元素与外界(如Javascript)的接口。

DOM与标签有着几乎一一对应的关系,如下:

<html>

<body>

<p>hello world</p>

<div><img src="aa.png"/></div>

</body>

</html>