1.爬虫基础

1.2 Web网页基础

1.2.1 网页的组成

​ 网页可以分为三大部分——HTML、CSS和JavaScript。如果把网页比作一个人,那么HTML相当于骨架、JavaScript相当于肌肉、CSS相当于皮肤,这三者结合起来才能形成一个完善的网页。下面分别介绍这三部分的功能。

HTML

​ HTML(Hypertext Markup Language)中文翻译为超文本标记语言,但我们通常不用中文翻译称呼它,一般就叫HTML。

​ HTML是一种用来描述网页的语言。网页包括文字、按钮、图片和视频等各种复杂的元素,其基础架构就是HTML。网页通过不同类型的标签来表示不同类型的元素,如用img标签表示图片、用video标签表示视频、用p标签表示段落,这些标签之间的布局常由布局标签div嵌套组合而成,各种标签通过不同的排列和嵌套形成最终的网页框架。

​ 我们随意打开一个网站,比如淘宝网首页,然后单击鼠标右键选择“检查”菜单或者按F12,即可打开浏览器开发者工具,接着切换到元素面板,这时候呈现的就是淘宝网首页对应的HTML,它包含了一系列标签,浏览器解析这些标签后,便会在网页中将它们渲染成一个个节点,这便形成了我们平常看到的网页。比如在图1-2-1中可以看到一个输入框就对应了一个input标签,可以用于输入文字。

图1-2-1 淘宝网网页源码

​ 不同标签对应不同的功能,这些标签定义的节点相互嵌套和组合形成了复杂的层次关系,就形成了网页的层次架构。

CSS

​ HTML定义了网页的架构,但是只有HTML的页面布局并不美观,有可能只是节点元素的简单排列。为了让网页更好看一些,可以借助CSS来实现。

​ CSS,全称叫做Cascading Style Sheets,即层叠样式表。“层叠”是指当HTML中引用了多个样式文件,并且样式发生冲突时,浏览器能够按照层叠顺序处理这些样式。“样式”指的是网页中的文字大小、颜色、元素间距、排列等格式。CSS是目前唯一的网页页面排版样式标准,有了它的帮助,页面才会变得更为美观。

​ 在图1-2-1中,右侧样式面板呈现的就是一系列CSS样式,我们摘抄一段:

.search-suggest-combobox>input, [data-sg-type=combobox]>input {

width: 100%;

height: 38px;

padding: 9px 0;

overflow-y: visible;

color: #000;

font-size: 14px;

line-height: 20px;

text-indent: 10px;

vertical-align: middle;

background-color: #fff;

border: 0;

outline: none;

}

​ 这就是一个CSS样式,大括号前面是一个CSS选择器,此选择器的意思是首先选中class为search-suggest-combobox的直接子input类和data-sg-type=combobox类的直接子input类。大括号的内部就是一条条样式规则,如width指定宽度为100%,表示占满父节点,height则指定了节点的高度为38px。也就是说,我们将位置、宽度、高度等样式配置统一写成这样的形式,然后用大括号括起来,接着在开头加上CSS选择器,这就代表这个样式对CSS选择器选中的节点生效,节点就会根据此样式来展示了。

​ 在网页中,一般会统一定义整个网页的样式规则,并写入CSS文件中(后缀为css)。在HTML中,只需要用link标签即可引入写好的CSS文件,这样整个页面就会变得美观、优雅。

JavaScript

​ JavaScript简称JS,是一种脚本语言。HTML和CSS组合使用,提供给用户的只是一种静态信息,缺乏交互性。我们在网页里还可能会看到一些交互和动画效果,如下载进度条、提示框、轮播图等,这通常就是JavaScript的功劳。JavaScript的出现使得用户与信息之间不只是一种浏览与显示的关系,还实现了一种实时、动态、交互的页面功能。

​ JavaScript通常也是以单独的文件形式加载的,后缀为js,在HTML中通过script标签即可引入。

​ 综上所述,HTML定义了网页的内容和结构,CSS描述了网页的样式,JavaScript定义了网页的行为。

1.2.2 网页的结构

​ 我们首先用例子感受一下HTML的基本结构。新建一个文本文件,名称叫做test.html,内容如下:

This is a Demo

Hello World

Hello, this is a paragraph.

​ 这就是一个最简单的HTML示例。开头用DOCTYPE定义了文档类型,其次最外层是html标签,代码最后有对应的结束标签表示闭合。html标签内部是head标签和body标签,分别代表网页头和网页体,它们同样需要结束标签。head标签内定义了一些对页面的配置和引用,上述代码中的指定了网页的编码为UTF-8。

​ title标签则定义了网页的标题,标题会显示在网页的选项卡中,不会显示在正文中。body标签内的内容是要在网页正文中显示的。div标签定义了网页中的区块,此处区块的id是container,id是一个非常常用的标签,其内容在网页中是唯一的,通过它可以获取这个区块。然后在此区块内又有一个div标签,它的class为wrapper,这也是一个非常常用的属性,经常与CSS配合使用来设定样式。然后次区块内部又有一个h2标签,代表一个二级标题;另外还有一个p标签,代表一个段落。若想在网页中呈现某些内容,直接把内容写入h2标签和p标签中间即可,这两者也有各自的class属性。

​ 将代码保存后,双击该文件在浏览器中打开,可以看到如图1-2-2所示的内容。

图1-2-2 运行结果

​ 可以看到,选项卡上显示This is a Demo字样,这是我们在head标签中的title里定义的文字。网页正文则是由body标签内部定义的各个元素生成的,可以看到这里显示了二级标题和段落。

​ 这个示例便是网页的一般结构。一个网页的标准形式是html标签内嵌套head标签和body标签,head标签内定义网页的配置和引用,body标签内定义网页的正文。

1.2.3 节点数及节点间的关系

​ 在HTML中,所有标签定义的内容都是节点,这些节点构成一个HTML节点树,也叫HTML DOM树。

​ 先来看一下什么是DOM。DOM是W3C(万维网联盟)的标准,英文全称是Document Object Model,即文档对象模型。它定义了访问HTML和XML文档的标准。根据W3C的HTML DOM标准,HTML文档中的所有内容都是节点。

整个网站文档是一个文档节点。每个html标签对应一个根节点,即上例中的html标签,它属于一个根节点。节点内的文本是文本节点,比如a节点代表一个超链接,它内部的文本也被认为是一个文本节点。每个节点的属性是属性节点,比如a节点有一个href属性,它就是一个属性节点。注释是注释节点,在HTML中有特殊的语法会被解析为注释,它也会对应一个节点。

​ 因此,HTML DOM将HTML文档视作树结构,这种结构被称为节点树,如图1-2-3所示。

图1-2-3 节点树

​ 通过HTML DOM,节点树中的所有节点均可通过JavaScript访问,所有HTML节点元素均可被修改、创建或删除。

​ 节点树中的节点彼此拥有层级关系。我们常用父(parent)、子(child)和兄弟(sibling)等术语描述这些关系。父节点拥有子节点,同级的子节点被称为兄弟节点。

​ 在节点树中,顶端节点被称为根(root)。除了根节点之外,每个节点都有父节点。图1-2-4展示了节点树以及树中节点间的关系。

图1-2-4 节点树及树中节点间的关系

1.2.4 选择器

​ 我们知道,网页由一个个节点组成,CSS选择器会为不同的节点设置不同的样式规则,那么应该怎样定位节点呢?

​ 在CSS中,使用CSS选择器来定位节点。例如,“网页的结构”一节的例子中div节点的id为container,那么这个节点就可以表示为#container,其中以#开头表示选择id,其后紧跟的是id的名称。如果想选择class作为wrapper的节点,则可以使用.wrapper,这里以 . 开头表示选择class,其后紧跟的是class的名称。除了这两种,还有一种选择方式,就是根据标签名,例如想选择二级标题,直接用h2即可。这些事最常用的三种方式,分别是根据id、class、标签名选择。

​ 另外,CSS选择器还支持嵌套选择,利用空格把各个选择器分隔开便可以代表嵌套关系,如#container .wrapper p表示先选择id为container的节点,然后选择其内部class为wrapper的节点,再进一步选择该节点内部的p节点。如果各个选择器之间不加空格,则代表并列关系,如div#container .wrapper p.text代表先选择id为container的div节点,然后选择器内部class为wrapper的节点,再进一步选择这个节点内部的class为text的p节点。这就是CSS选择器,其筛选功能非常强大。

​ 我们可以在浏览器中测试CSS选择器的效果,依然打开浏览器的检查选项,然后按快捷键Ctrl+F,这时左下角会出现一个搜索框,如图1-2-5所示。

图1-2-5 搜索节点

​ 这时候我们输入.title就是选中了class为title的节点,该节点会被选中并在网页中高亮显示,如图1-2-6所示。

图1-2-6 节点搜索结果

​ 输入div#container .wrapper p.text就逐层选中了id为container的节点中class为wrapper的节点中的p节点,如图1-2-7所示。

图1-2-7 节点搜索结果

​ CSS选择器还有一些其他语法规则,具体如表1-2-1所示。

表1-2-1 CSS选择器的其他语法规则

选择器举例举例描述.class.intro选择class=“intro”的所有节点#id#firstname选择id=“firstname”的所有节点**选择所有节点elementp选择所有p节点element,elementdiv,p选择所有div节点和所有p节点element elementdiv p选择div节点内部的所有p节点element>elementdiv>p选择父节点为div节点的所有p节点element+elementdiv+p选择进阶在div节点之后的所有p节点[attribute][target]选择带有target属性的所有节点[attribute=value][target=blank]选择target=“blank”的所有节点[attribute~=value][title~=flower]选择title属性包含单词flower的所有节点:linka:link选择所有未被访问的链接:visiteda:visited选择所有已被访问的链接:activea:active选择活动链接:hovera:hover选择鼠标指针位于其上的链接:focusinput:focus选择获得焦点的input节点::first-letterp::first-letter选择每个p节点的首字母::first-linep::first-line选择每个p节点的首行:first-childp:first-child选择属于父节点的第一个子节点的所有p节点::beforep::before在每个p节点的内容之前插入内容::afterp::after在每个p节点的内容之后插入内容:lang(language)p:lang(it)选择带有it开头的lang属性值的所有p节点element1~element2p~ul选择前面有p节点的所有ul节点[attribute^=value]a[src^=“https”]选择src属性值以https开头的所有a节点[attribute$=value]a[src$=“.pdf”]选择src属性值以.pdf结尾的所有a节点[attribute*=value]a[src*=“abc”]选择src属性值中包含abc子串的所有a节点:first-of-typep:first-of-type选择属于对应父节点的首个p节点的所有p节点:last-of-typep:last-of-type选择属于对应父节点的最后一个p节点的所有p节点:only-of-typep:only-of-type选择属于对应父节点的唯一p节点的所有p节点:only-childp:only-child选择属于对应父节点的首个子节点的所有p节点:nth-child(n)p:nth-child(2)选择属于对应父节点的第二个子节点的所有p节点:nth-last-child(n)p:nth-last-child(2)同上,不过是从最后一个子节点开始计数:nth-of-type(n)p:nth-of-type(2)选择属于对应父节点的第二个p节点的所有p节点:nth-last-of-type(n)p:nth-last-of-type(2)同上,不过是从最后一个子节点开始计数:last-childp:last-child选择属于对应父节点的最后一个子节点的所有p节点:root:root选择文档的根节点:emptyp:empty选择没有子节点的所有p节点(包括文本节点):target#news:target选择当前活动的#news节点:enabledinput:enabled选择每个启用的input节点:disabledinput:disabled选择每个禁用的input节点:checkedinput:checked选择每个被选中的input节点:not(selector):not选择非p节点的所有节点::selection::selection选择被用户选取的节点部分

​ 另外,还有一种比较常用的选择器XPath,这种选择方式在之后会详细介绍。

精彩内容

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。