爬虫基础 - 网页基础
网页的组成
网页可以分为三大部分——HTML、CSS和JavaScript。
HTML
HTML是用来描述网页的一种语言,其全称叫作Hyper Text Markup Language,即超文本标记语言。网页包含文字、按钮、图片和视频等各种复杂的元素,其基础架构就是HTML。不同类型的文字通过不同类型的标签来表示,如图片用img标签表示,视频用video标签表示,段落用p标签表示,他们之间的布局又常通过布局标签div嵌套组合而成,各种标签通过不同的排列和嵌套才形成了网页的框架。
CSS
HTML定义了网页的结构,但是只有HTML页面的布局并不美观,可能只是简单的节点元素的排列,为了让网页看起来更好看一些,这里借助了CSS。
CSS,全称叫作Cascading Style Sheets,即层叠样式表。“层叠”是指当在HTML中引用了数个样式文件,并且样式发生冲突时,浏览器能依据层叠顺序处理。“样式”指网页中文字大小、颜色、元素间距、排列等格式。
JavaScript
JavaScript,简称JS,是一种脚本语言。HTML和CSS配合使用,提供给用户的只是一种静态信息,缺乏交互性。我们在网页里可能会看到一些交互和动画效果,如下载进度条、提示框、轮播图等,这通常就是JavaScript的功劳。它的出现使得用户与信息之间不只是一种浏览与显示的关系,而是实现了一种实时、动态、交互的页面功能。
JavaScript通常也是以单独的文件形式加载的,后缀为js,在HTML中通过script标签即可引入,例如:
<script src="jquery-2.1.0.js"></script>
综上所述,HTML定义了网页内容和结构,CSS描述了网页的布局,JavaScript定义了网页的行为。
网页的结构
新建一个文本文件,后缀名为html。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>This is a Demo</title>
</head>
<body>
<div id="container">
<div class="wrapper">
<h2 class="title">Hello World</h2>
<p class="text">Hello, this is a paragraph.</p>
</div>
</div>
</body>
</html>
节点树及节点间的关系
在HTML中,所有标签定义的内容都是节点,他们构成了一个HTML DOM树。
DOM是W3C的标准,其英文全称Document Object Model,即文档对象模型。它定义了访问HTML和XML文档的标准:
W3C文档对象模型(DOM)是中立于平台和语言的接口,它允许程序动态地访问和更新文档的内容、结构和样式。
W3C DOM标准被分为3个不同的部分。
- 核心 DOM:针对任何结构化文档的标准模型。
- XML DOM:针对XML文档的标准模型。
- HTML DOM:针对HTML文档的标准模型。
根据W3C的HTML DOM标准,HTML文档中的所有内容都是节点。
- 整个文档是一个文档节点。
- 每个HMTL元素是元素节点。
- HTML元素内的文本是文本节点。
- 每个HTML属性是属性节点。
- 注释是注释节点。
通过HTML DOM,树中的所有节点均可通过JavaScript访问,所有HTML节点元素均可被修改,也可以被创建或删除。
节点树中的节点彼此拥有层级关系。我们常用父(parent)、子(child)和兄弟(sibling)等术语描述这些关系。父节点拥有子节点,同级的子节点被称为兄弟节点。
选择器
选择器 | 例子 | 例子描述 |
---|---|---|
.class | .intro | 选择class="intro"的所有节点 |
#id | #firstname | 选择id="firstname"的所有节点 |
* | * | 选择所有节点 |
element | p | 选择所有p节点 |
element,element | div,p | 选择所有div节点和所有p节点 |
element element | div p | 选择div节点内部的所有p节点 |
element>element | div>p | 选择父节点为div节点的所有p节点 |
element+element | div+p | 选择紧接在div节点之后的所有p节点 |
[attribute] | [target] | 选择带有target属性的所有节点 |
[attribute=value] | [target=blank] | 选择target="blank"的所有节点 |
[attribute~=value] | [title~=flower] | 选择title属性包含单词flower的所有节点 |
:link | a:link | 选择所有未被访问的链接 |
:visited | a:visited | 选择所有已被访问的链接 |
:active | a:active | 选择活动链接 |
:hover | a:hover | 选择鼠标指针位于其上的链接 |
:focus | input:focus | 选择获得焦点的input节点 |
:first-letter | p:first-letter | 选择每个p节点的首字母 |
:first-line | p:first-line | 选择每个p节点的首行 |
:first-child | p:first-child | 选择属于父节点的第一个子节点的所有p节点 |
:before | p:before | 在每个p节点的内容之前插入内容 |
:after | p:after | 在每个p节点的内容之后插入内容 |
:lang(language) | p:lang | 选择带有以it开头的lang属性值得所有p节点 |
element1~element2 | p~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-type | p:first-of-type | 选择属于其父节点的首个p节点的所有p节点 |
:last-of-type | p:last-of-type | 选择属于其父节点的最后p节点的所有p节点 |
:only-of-type | p:only-of-type | 选择属于其父节点的唯一子节点的所有p节点 |
:only-child | p:only-child | 选择属于其父节点的唯一子节点的所有p节点 |
:nth-child(n) | p:nth-child | 选择属于其父节点的第二个子节点的所有p节点 |
:nth-last-child(n) | p:nth-last-child | 同上,从最后一个子节点开始计数 |
:nth-of-type(n) | p:nth-of-type | 选择属于其父节点第二个p节点的所有p节点 |
:nth-last-of-type(n) | p:nth-last-of-type | 同上,但是从最后一个子节点开始计数 |
:last-child | p:last-child | 选择属于其父节点最后一个子节点的所有p节点 |
:root | :root | 选择文档的根节点 |
:empty | p:empty | 选择没有子节点的所有p节点(包括文本节点) |
:target | #news:target | 选择当前活动的#news节点 |
:enabled | input:enabled | 选择每个启动的input节点 |
:disabled | input:disabled | 选择每个禁用的input节点 |
:checked | input:checked | 选择每个被选中的input节点 |
:not(selector) | :not | 选择非p节点的所有节点 |
::selection | ::selection | 选择被用户选取的节点部分 |