Python爬虫开发与项目实战(2)

it2024-06-28  43

文章目录

第二章 Web前端基础2.1 W3C标准2.1.1 HTMLHTML的基本结构文档设置标记格式标记包括:文本标记包括: 图像标记超链接的的使用表格 2.1.2 CSSCSS的使用方式颜色属性字体属性背景属性文本属性列表实例 2.1.3 JavaScriptJavaScript的基本用法JavaScript的基本语法数据类型和变量运算符和操作符条件判断循环函数 2.1.4 XPathXPath节点XPath语法XPath轴XPath运算符 2.1.5 JSON 2.2 HTTP标准2.2.1 HTTP请求过程2.2.2 HTTP状态码含义2.2.3 HTTP头部信息2.2.4 Cookie状态管理2.2.5 HTTP请求方式

第二章 Web前端基础

2.1 W3C标准

W3C,即万维网联盟,是Web技术领域有最具权威和影响力的国际中立性技术标准机构网页主要由三部分组成:结构(structure)、表现(presentation)和行为(behavior)对应的标准也分为三方面: 结构化标准语言主要包括XHTML和XML表现标准语言主要包括CSS行为标准主要包括对象模型(如W3C DOM)、ECMAScript等

2.1.1 HTML

HTML不是编程语言,是一种表示网页信息的符号标记语言Web浏览器的作用是读取HTML文档,并以网页的形式显示出他们HTML语言的特点包括: 可以设置文本的格式,比如标题、字号、文本颜色、段落等可以创建列表可以插入图像和媒体可以建立表格超链接,可以使用鼠标点击超链接来实现页面之间的跳转

HTML的基本结构

<html> 内容 </html>

HTML文档由<html></html>包裹,这是HTML文档的文档标记也称为HTML开始标记。这对标记分别位于网页的最前端和最后端,分别表示网页的开始和结束

<head> 内容 </head>

HTML文件头标记,也称为HTML头信息开始标记。用来包含文件的基本信息,比如网页的标题、关键字。

在<head></head>内可以放<title></title>、<meta></meta>、<style></style>等标记

在<head></head>标记内的内容不会在浏览器中显示

<title>内容</title>

HTML文件标题标记,显示在浏览器窗口的左上边

<body> 内容 </body>

<body></body>是网页的主体部分,在此标记之间可以包含<p></p>、<h1></h1>、<br>、<hr>等标记

<body></body>之间的内容组成了我们看见的网页

<meta>内容</meta>

页面的元信息。提供有关页面的元信息,比如这很对搜索引擎和更新频度的描述和关键词

注意meta标记必须放在head元素里面

文档设置标记

格式标记包括:

<br>:强制换行标记。将之后的内容显示在下一行

<p>:换段落标记。由于多个空格和回车在HTML中等效于一个空格,所以要用<p>来实现换段落。<p>段落中也可以包括<p>段落

<center>:居中对齐标记。让段落或者文字相对于父标记居中显示

<pre>:预格式化标记。保留预先编排好的格式,常用来定义计算机源代码。和<p>进行对比。

<li>:列表项目标记。每一个列表使用一个<li>标记,可用在有序列表(<ol>)和无序列表(<ul>)中

<ul>:无序列表标记

<ol>:有序列表标记。可以显示特定的一些顺序。

默认type属性值“A”表示大写字母“A,B,C”等属性值“1”表示阿拉伯数字属性值“a”表示小写字母“a, b, c”等属性值”I“表示大写罗马数字I、II、III、IV等属性值”i“表示小写罗马数字i、ii、iii、iv等

<dl><dt><dd>:定义型列表。对列表条目进行简短说明

<hr>:水平分割线标记。可以用作段落之间的分割线

<div>:分区显示标记,也称为层标记。可以用于将表格式化,与<p>相似,可以多层嵌套使用

样例:

<html> <head> <title>Python爬虫开发与项目实战</title> <meta charset="UTF-8"> </head> <body> 文档设置标记<br> <p>这是段落。</p> <p>这是段落。</p> <p>这是段落。</p> <hr> <center>居中标记1</center> <center>居中标记2</center> <hr> <pre> [00:00](music) [00:28]你我皆凡人,生在人世间; [00:35]终日奔波苦,一刻不得闲; [00:43]既然不是仙,难免有杂念; </pre> <hr> <p> [00:00](music) [00:28]你我皆凡人,生在人世间; [00:35]终日奔波苦,一刻不得闲; [00:43]既然不是仙,难免有杂念; </p> <hr> <br> <ul> <li>Coffee</li> <li>Milk</li> </ul> <ol type="A"> <li>Coffee</li> <li>Milk</li> </ol> <dl> <dt>计算机</dt> <dd>用来计算的仪器 ... ...</dd> <dt>显示器</dt> <dd>以视觉方式显示信息的装置 ... ...</dd> </dl> <div > <h3>这是标题</h3> <p>这是段落。</p> </div> </body> </html>

文本标记包括:

<hn>:标题标记。总共有6个级别,<h1>最大,<h6>最小

<font>:字体设置标记。用来设置字体的格式,一般有三个常用属性:

size(字体大小),如:<font size=“14px”>color(字体颜色),如:<font color=“red”>face(字体),如:<font face=“微软雅黑”>

<b>:粗字体标记

<i>:斜字体标记

<sub>:文字下标字体标记

<sup>:文字上标字体标记

<tt>:打印机字体标记

<cite>:引用方式的字体,通常是斜体

<em>:表示强调,通常显示为斜体

<strong>:表示强调,通常显示为粗体

<small>:小型字体标记,可以显示小一号字体

<big>:大型字体标记,可以显示大一号字体

<u>:下划线字体标记

样例:

<html> <head> <title>Python爬虫开发与项目实战</title> <meta charset="UTF-8"> </head> <body> Hn标题标记---->> <br> <h1>Python爬虫</h1> <h2>Python爬虫</h2> <h3>Python爬虫</h3> <h4>Python爬虫</h4> <h5>Python爬虫</h5> <h6>Python爬虫</h6> font标记---->> <font size="1">Python爬虫</font> <font size="3">Python爬虫</font> <font size="7">Python爬虫</font> <font size="7" color="red" face="微软雅黑">Python爬虫</font> <font size="7" color="red" face="宋体">Python爬虫</font> <font size="7" color="red" face="新细明体">Python爬虫</font> <br> B标记加粗---->> <b>Python爬虫</b> <br> i标记斜体---->> <i>Python爬虫</i> <br> sub下标标记---->> 2<sub>2</sub> <br> sup上标标记---->> 2<sup>2</sup> <br> 引用标记---->> <cite>Python爬虫</cite> <br> em标记表示强调,显示为斜体---->> <em>Python爬虫</em> <br> strong标记表示强调,加粗显示---->> <strong>Python爬虫</strong> <br> small标记,可以显示小一号字体,可以嵌套使用---->> <small>Python爬虫</small> <small><small>Python爬虫</small></small> <small><small><small>Python爬虫</small></small></small> <br> big标记,显示大一号的字体---->> <big>Python爬虫</big> <big><big>Python爬虫</big></big> <br> u标记是显示下划线---->> <big><big><big><u>Python爬虫</u></big></big></big> <br> </body> </html>

图像标记

<img>称为图像标记,使用方式为:

<img src="路径/文件名.图片格式" width="属性值" height="属性值" border="属性值" alt="属性值"> src属性用来指定要加载的图片的路径、名称以及格式width属性用来指定图片的宽度,单位为px、em、cm、mmheight属性用来指定图片的高度,单位为px、em、cm、mmborder属性用来指定图片的边框宽度,单位为px、em、cm、mmalt属性有两个作用: 如果图像没有下载或者加载失败,会用文字来代替图像显示搜索引擎可以通过这个属性的文字来抓取图片

例如博客园首页图片的img标记:

<img src="/images/logo_small.gif" alt="博客园Logo" width="142" height="55">

超链接的的使用

链接的引用使用的是<a>标记,使用方式为:

<a href="链接地址" target=“打开方式” name=“页面锚点名称”>链接文字或者图片</a> href属性值是链接的地址。可以是一个网页,也可以是一个视频、图片、音乐等。target属性用来定义超链接的打开方式 属性值为_blank时,作用是在一个新的窗口中打开链接属性值为_self(默认值)时,作用是在当前窗口中打开链接属性值为_parent时,作用是在父窗口中打开页面属性值为_top时,在顶层窗口中打开文件 name属性用来指定页面的锚点名称

表格

表格的基本结构包括<table>、<caption>、<tr>、<td>、<th>等标记

<table>标记有以下常见属性

width:表示表格的宽度。它的值可以是宽度(px),也可以是父级元素的百分比(%)height:表示表格的高度。它的值可以是宽度(px),也可以是父级元素的百分比(%)border:表示外边框的宽度align:用来表示表格的显示位置。left是左对齐,center是居中,right是右对齐cellspacing:单元格之间的间距。默认是2px,单位为像素cellpadding:单元格内容与单元格边框的显示距离,单位为像素frame:用来控制表格边框最外层的四条线框 void:无边框above:仅有顶部边框below:仅有底部边框hsides:仅有顶部边框和底部边框lhs:仅有左侧边框rhs:仅有右侧边框vsides:仅有左右侧边框border:包含全部4个边框 rules:控制是否显示及如何显示单元格之间的分割线 none:无分割线all:所有分割线rows:仅有行分割线cols:仅有列分割线groups:仅在行组和列组之间有分割线

<caption>标记用于在表格张红使用标题

<caption>属性的位置位于<table>属性之后,<tr>表格行之前

<caption>标记中align属性可以取top、bottom、left、right四个值,分别表示标题显示在上、下、左、右

<tr>标记用来定义表格的行,对于每一个表格行,都是由一对<tr>…</tr>标记表示,每一个<tr>标记内可以嵌套多个<td>或<th>标记

<tr>标记的常见属性包括:

bgcolor:设置背景颜色。格式为bgcolor=“颜色值”valign:用来设置垂直对齐方式。格式为valign=“值” bottom:靠顶端对齐top:靠底部对齐middle:居中对齐 align:用来设置水平方向对齐方式。格式为align=“值” left:左对齐right:右对齐center:居中对齐

<td>和<th>都是单元格的标记,必须嵌套在<tr>标记内,成对出现

<th>是表头标记,通常位于首行或首列,其中的文字默认会被加粗,而<td>不会

<td>是数据标记,表示该单元格的具体数据

<td>和<th>的常用数据是一致的,如下:

bgcolor:设置单元格背景align:设置单元格水平对齐方式vlign:设置单元格垂直对齐方式width:设置单元格宽度height:设置单元格高度rowspan:设置单元格所占行数colspan:设置单元格所占列数

样例:

<html> <head> <title>学生信息表</title> <meta charset="UTF-8"> </head> <body> <table width="960" align="center" border="1" rules="all" cellpadding="15"> <tr> <th>学号</th> <th>班级</th> <th>姓名</th> <th>年龄</th> <th>籍贯</th> </tr> <tr align="center"> <td>1500001</td> <td>(1)班</td> <td>张三</td> <td>16</td> <td>上海</td> </tr> <tr align="center"> <td>1500011</td> <td>(2)班</td> <td>李四</td> <td>15</td> <td bgcolor="#ccc">浙江</td> </tr> </table> <br/> <table width="960" align="center" border="1" rules="all" cellpadding="15"> <tr bgcolor="#ccc"> <th>学号</th> <th>班级</th> <th>姓名</th> <th>年龄</th> <th>籍贯</th> </tr> <tr align="center"> <td>1500001</td> <td>(1)班</td> <td>张三</td> <td>16</td> <td bgcolor="red"><font color="white">上海</font></td> </tr> <tr align="center"> <td>1500011</td> <td>(2)班</td> <td>李四</td> <td>15</td> <td>浙江</td> </tr> </table> </body> </html>

2.1.2 CSS

CSS的使用方式

CSS指层叠样式表(Cascading Style Sheets),用来定义如何显示HTML元素,一般和HTML配合使用

CSS样式表的目的是为了解决内容与表现分离的问题,即同一个HTML文档也能有多种表现方式

在HTML中使用CSS的方式有:

内联样式表:CSS代码直接写在现有的HTML标记中,直接使用style属性改变样式

<body style="background-color:green; margin:0; padding:0;"></body>

嵌入式样式表:CSS样式代码直接写在<style type=“text/css”></style>标记之间,一般情况下嵌入式CSS样式写在<head></head>之间

外部样式表:CSS代码写在一个单独的外部文件中,以.css为扩展名,在<head>内使用<link>标记将CSS样式文件链接到HTML文件内

<link rel="StyleSheet" type="text/css" href="style.css">

CSS规则由两个主要的部分构成

选择器:通常是需要改变样式的HTML元素

一条或多条声明:每条声明由一个属性和一个值组成。属性是希望设置的样式属性,每个属性有一个值,属性和值由冒号分开

h1{color:blue;font-size:12px} 将h1标记中的颜色设置为蓝色,字体大小为12pxh1:选择器color和font-size:属性blue和12px:属性值

根据选择器的定义方式,可以将样式表的定义分成三种方式:

HTML标记定义:如果想修改<p>…</p>的样式,可以定义CSS:p{属性:属性值}

ID选择器定义:可以为标有特定ID的HTML元素指定特定的样式。HTML元素以ID属性来设置ID选择器,CSS中ID选择器以#来定义,如:

/* 将HTML中ID为word的元素设置为居中,颜色为红色 */ #word{text-align:center;color:red;}

class选择器定义:用于描述一组元素的样式,可以在多个元素中使用。HTML元素以class属性来设置class选择器,CSS中以一个点“.”号显示,如:

/* 将所有拥有center类的HTML元素设为居中 */ .center{text-align:center;} /* 对所有p元素使用class="center",让该元素的文本居中 */ p.center{text-align:center;}

颜色属性

颜色属性用color来定义文本的颜色,可以使用以下方式: 颜色名称:color:green十六进制:color:#ff6600简写十六进制:color:#f60RGB方式:color:rgb(255, 255, 255)RGBA方式:color:rgba(255, 255, 255, 1)

字体属性

可以使用字体属性定义文本形式: font-size定义字体大小。如:font-size:14pxfont-family定义字体。字体之间可以使用“,”隔开,以确保当字体不存在时直接使用下一个字体。如:font-family:微软雅黑, seriffont-weight定义字体加粗。取值有使用名称和数字的两种方式 normal(默认值)、bold(粗)、bolder(更粗)、lighter(更细)100、200、300~900(400=normal,700=bold)

背景属性

可以使用背景属性定义背景的颜色、图片、重复和位置

background-color:定义背景的颜色,用法参考颜色属性

background-image:定义背景图片,如background-image:url(图片路径)或取值为none表示不使用图片

background-repeat:定义背景重复方式

repeat:表示整体重复平铺repeat-x:只在水平方向平铺repeat-y:只在垂直方向平铺no-repeat:不重复

background-position:定义背景位置。在横向可取值left、center、right;在纵向可取值top、center、bottom

简写方式可以简化背景属性的书写,格式为background: 背景颜色 图片url 重复 位置,如:

background:#f60 url(images/bg.jpg) no-repeat top center

文本属性

可以用文本属性设置行高、缩进和字符间距 text-align:设置文本对齐方式,取值为left、center、rightline-height:设置文本行高,取值可以取具体数值,也可以取基于字体大小的百分比行高text-indent:首行缩进,如text-indent:50pxletter-spacing:设置字符间距,默认为normal(字符间没有额外空间);可以设置具体的数值(可以为负),如letter-spacing:3px;可以取inherit,从父元素继承letter-spacing的值

列表

使用CSS对列表进行设置:

list-style-type:指明列表项标记的类型

none:无标记

disc / circle:实心圆/空心圆

square:实心方块

decimal / decimal-leading-zero:数字标记/0开头的数字标记

lower-roman / upper-roman:小写/大写 罗马数字

lower-alpha / upper-alpha:小写/大写 英文字母

如:

/* 将class选择器为a的ul标记设置为空心圆标记 */ ul.a{list-style-type: circle;}

list-style-position:致命列表项中标记的位置

inside:列表项标记放在文本以内,且环绕文本根据标记对齐outside(默认):保持标记位于文本的左侧,列表项标记放置在文本以外,且环绕文本不根据标记对齐inherit:从父元素继承list-style-position的值

list-style-imgae:设置图像列表标记

URL:图像的路径

none:默认无图形被显示

inherit:从父元素继承list-style-image的值

如:

/* 给ul标记前面的标记设置为image.gif图片 */ ul{list-style-image:url('image.gif');}

实例

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Python爬虫开发</title> <style> h1 { background-color:#6495ed;/*--背景颜色--*/ color:red;/* 字体颜色 */ text-align:center;/* 文本居中 */ font-size:40px;/* 字体大小*/ } p { background-color:#e0ffff; text-indent:50px;/* 首行缩进 */ font-family:"Times New Roman", Times, serif;/* 设置字体 */ } p.ex {color:rgb(0,0,255);} div { background-color:#b0c4de; } ul.a {list-style-type:square;} ol.b {list-style-type:upper-roman;} ul.c{list-style-image:url('http://www.cnblogs.com/images/logo_small.gif');} </style> </head> <body> <h1>CSS background-color演示</h1> <div> 该文本插入在 div 元素中。 <p>该段落有自己的背景颜色。</p> <p class="ex">这是一个类为"ex"的段落。这个文本是蓝色的。</p> 我们仍然在同一个 div 中。 </div> <p>无序列表实例:</p> <ul class="a"> <li>Coffee</li> <li>Tea</li> <li>Coca Cola</li> </ul> <p>有序列表实例:</p> <ol class="b"> <li>Coffee</li> <li>Tea</li> <li>Coca Cola</li> </ol> <p>图片列表示例</p> <ul class="c"> <li>Coffee</li> <li>Tea</li> <li>Coca Cola</li> </ul> </body> </html> 完整图片资源:

2.1.3 JavaScript

JavaScript的基本用法

JavaScript是一种轻量级的脚本语言,由浏览器进行解释执行,可以插入在HTML页面中

使用JavaScript有两种做法:

直接插入代码:在<script></script>标记中编写代码,可以直接嵌在网页的任何地方,不过通常放在<head></head>中。如:

<html> <head> <script type='text/javascript'> alert('Hello, world'); </script> </head> <body> python爬虫 </body> </html>

外部引用js文件:把JavaScript代码放到一个单独的.js文件,然后再HTML中通过<script src='目标文档的URL'></script>的方式来引入js文件。如:

<html> <head> <script src = "/static/js/jquery.js"></script> </head> <body> python爬虫 </body> </html>

JavaScript的基本语法

JavaScript严格区分大小写JavaScript会忽略各种元素之间的空格、制表符、换行符每条语句以分号结尾,最后一个语句的分号可以省略使用{…}包含多个语句可以形成一个语句块,{…}还可以嵌套使用JavaScript的两种注释形式为”//…“和”/*…*/“

数据类型和变量

在JavaScript中定义了一下几种数据类型:

Number类型:JavaScript中不区分整数和浮点数,统一使用Number表示,特殊的Number有:NaN(无法计算时使用)和Infinity(无限大)

字符串类型:是以单引号或双引号括起来的任意文本

布尔值类型:true或false

数组类型:数组是一组按顺序排列的集合,JavaScript的数组可以包括任意数据类型,元素之间用“,”分隔,数组的元素可以通过索引来访问,索引的起始值为0。创建数组的方法如下:

var array = [1, 2, 3.14, 'Hello', null, true]; var array = new Array(1, 2, 3);

对象类型:JavaScript的对象是一组由键-值组成的无序集合,其中,键都是字符串类型,值可以是任意数据类型,要获取一个对象的属性,可以使用“对象变量.属性名”的方式。一个示例如下:

var person = {name: 'qiye', age: 24, tags: ['python', 'web', 'hacker'], city: 'Beijing', man: true} person.name // 获取person对象的name属性

JavaScript声明变量时都使用关键字var,而不是int、char等数据类型,为变量赋值时会自动判断类型并进行转换

变量名是大小写英文、数字、“$”和“_”的组合,且不能以数字开头,也不能是JavaScript的关键字

运算符和操作符

类别操作符特殊示例算数操作符+、-、*、/、%0 / 0; // NaN 2 / 0; //Infinity字符串操作符+(字符串连接)、+=(字符串连接复合)布尔操作符!、&&、||一元操作符++、–、+(一元加)、-(一元减)关系比较操作符<、<=、>、>=、!=、==、===、!==false == 0; // truefalse === 0; // false按位操作符~、&、|、^、<<、>>(有符号右移)、>>>(无符号右移)赋值操作符=、+=、-=、*=、%=、~=、&=、|=、^=、<<=、>>=、>>>=对象操作符.(属性访问)、[](属性或数组访问)、new(调用构造函数创建对象)、delete(变量属性删除)、void(返回undefined)、in(判断属性)、instanceof(原型判断)其他操作符?:(条件操作符)、,(逗号操作符)、()(分组操作、typeof(类型判断符)typeof true; // 返回字符串“boolean”

条件判断

JavaScript使用if() {…} else {…}来进行条件判断,和C语言的使用方法一样

var age = 20; if (age > 18) { alert('adult'); } else { alert('teenager'); }

循环

JavaScript的循环包括for循环和while循环两种

for循环:

var x = 0; var i; for (i=1; i<=100; i++) { x = x + i; } var person = { name: 'qiye', age: 20, city: 'Beijing' }; for (var key in person) { alert(key); // 'name', 'age', 'city' }

while循环:和C语言一样,分为while(){…}和do{…}while(),这里不再举例

函数

JavaScript函数举例:

function add(x,y) { return x+y; }

上述add()函数的定义如下:

function指出这是一个函数定义add是函数的名称(x,y)括号内列出函数的参数,多个参数以“,”分隔{…}之间的代码是函数体,可以包含0条或多条语句

调用函数时,按顺序传入参数即可,如add(10, 9);

JavaScript允许传入任意个参数而不影响调用,传入过多的参数只会使用到前几个,而传入过少的参数则会将少的参数定义为undefined,如:

add(10, 9, ‘blablabla’); // 返回19add(); // 返回NaN

2.1.4 XPath

XPath是一门在XML文档中查找信息的语言,但也能很好的在HTML文档中工作XPath通过路径表达式的形式来指定元素

XPath节点

在XPath中,XML是被作为节点树来对待的

有7种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点

示例文档:

<?xml version="1.0" encoding="ISO-8859-1"?> <classroom> <student> <id>1001</id> <name lang="en">marry</name> <age>20</age> <country>China</country> </student> </classroom> 节点包括:<classroom>(文档节点)、<id>1001</id>(元素节点)、lang=“en”(属性节点)、marry(文本)student是元素id、name、age以及country元素的父节点id、name、age以及country元素都是student元素的子节点id、name、age以及country元素都是兄弟节点,拥有相同的父节点name元素的祖先是student元素和classroom元素classroom的后代是id、name、age以及country元素

XPath语法

示例文档:

<?xml version="1.0" encoding="ISO-8859-1"?> <classroom> <student> <id>1001</id> <name lang="en">marry</name> <age>20</age> <country>China</country> </student> <student> <id>1002</id> <name lang="en">jack</name> <age>25</age> <country>USA</country> </student> </classroom>

XPath使用路径表达式来选取XML文档中的节点或节点集

以下是常用的路径表达式进行节点的选取:

表达式描述nodename选取此节点的所有子节点/从根节点选取//选择任意位置的某个节点.选取当前节点…选取当前节点的父节点@选取属性

节点选取示例(根据上面的XML):

表达式实现效果classroom选取classroom元素的所有子节点/classroom选取根元素classroomclassroom/student选取属于classroom的子元素的所有student元素//student选取所有student子元素,而不管他们在文档中的位置classroom//student选取属于classroom元素的后代的所有student元素,而不管他们位于classroom之下的什么位置/@lang选取名为lang的所有属性

通过谓语可以选取某个特定的节点或者包含某一个指定的值的节点

谓语被嵌在方括号中,示例如下:

表达式实现效果/classroom/student[1]选取属于classroom子元素的第一个student元素/classroom/student[last()]选取属于classroom子元素的最后一个student元素/classroom/student[last()-1]选取属于classroom子元素的倒数第二个student元素/classroom/student[position() < 3]选取最前面的两个属于classroom元素的子元素的student元素//name[@lang]选取所有拥有名为lang的属性的name元素//name[@lang=‘en’]选取所有name元素,并且这些元素拥有值为en的lang属性/classroom/student[age>20]选取属于classroom子元素的所有student元素,且其中的age元素的值须大于20/classroom/student[age>20]/name选取属于classroom子元素的student元素的所有name元素,且其中的age元素的值须大于20

XPath在进行节点选取的时候可以使用通配符“*”匹配未知的元素,同时使用操作符“|”一次选取多条路径,示例如下:

表达式实现效果/classroom/*选取classroom元素的所有子元素//*选取文档中的所有元素//name[@*]选取所有带有属性的name元素//student/name | //student/age选取student元素的所有name和age元素/classroom/student/name | //age选取属于classroom元素的student元素的所有name元素,以及文档中所有的age元素

XPath轴

轴定义了所选节点与当前节点之间的树关系,轴的存在会使提取变得更加灵活和准确

XPath轴中使用的节点集:

轴名称含义child选取当前节点的所有子元素parent选取当前节点的父节点ancestor选取当前节点的所有祖先ancestor-or-self选取当前节点的所有祖先以及当前节点本身descendant选取当前节点的所有后代descendant-or-self选取当前节点的所有后代以及当前节点本身preceding选取文档中当前节点的开始标记之前的所有节点following选取文档中当前节点的结束标记之后的所有节点preceding-sibling选取当前节点之前的所有兄弟节点following-sibling选取当前节点之后的所有兄弟节点self选取当前节点attribute选取当前节点的所有属性namespace选取当前节点的所有命名空间节点

示例文档:

<?xml version="1.0" encoding="ISO-8859-1"?> <classroom> <student> <id>1001</id> <name lang="en">marry</name> <age>20</age> <country>China</country> </student> <student> <id>1002</id> <name lang="en">jack</name> <age>25</age> <country>USA</country> </student> <teacher> <classid>1</classid> <name lang="en">tom</name> <age>50</age> <country>USA</country> </teacher> </classroom> 表达式实现效果/classroom/child::teacher选取当前classroom节点中子元素的teacher节点//id/parent::*选取所有id节点的父节点//classid/ancestor::*选取所有以classid为子节点的祖先节点/classroom/descendant::*选取classroom节点下的所有后代节点//student/descendant::id选取所有以student为父节点的id元素//classid/ancestor-or-self::*选取所有classid元素的祖先节点及本身/classroom/student/descendant-or-self::*选择/classroom/student本身及后代所有元素/classroom/teacher/preceding-sibling::*选取/classroom/teacher之前的所有兄弟节点(在上例的结果是选中所有student节点)/classroom/student[2]/following-sibling::*选取/classroom中第二个student之后的所有兄弟节点(在上例的结果是选中teacher节点)/classroom/teacher/preceding::*选取/classroom/teacher节点所有之前的节点(除其祖先外)(在上例中不仅是student节点,还有里面的子结点)/classroom/student[2]/following::*选择/classroom中第二个student之后的所有节点(在上例的结果是选择了teacher节点及其子结点)//student/self::*选取student节点(一般不单独使用,而是配合其他轴一起使用)/classroom/teacher/name/attribute::*选取/classroom/teacher/name节点下的所有属性

XPath运算符

XPath表达式可返回节点集、字符串、逻辑值及数字 运算符描述实例含义|计算两个节点集//student/name | //student/age选取student元素的所有name和age元素+加法/classroom/student[age=19+1]选取classroom的所有student元素,且其中的age元素的值等于19+1-减法/classroom/student[age=21-1]类似上一个*乘法/classroom/student[age=4*5]类似上一个div除法/classroom/student[age=40 div 2]类似上一个=等于/classroom/student[age=20]类似上一个!=不等于/classroom/student[age!=20]类似上一个<小于/classroom/student[age<20]类似上一个<=小于等于/classroom/student[age<=20]类似上一个>大于/classroom/student[age>20]类似上一个>=大于等于/classroom/student[age>=20]类似上一个or或/classroom/student[age<20 or age>25]类似上一个and与/classroom/student[age>20 or age<25]类似上一个mod取余5 mod 2取余数

2.1.5 JSON

JSON是JavaScript对象表示法(JavaScript Object Notation),用于存储和交换文本信息JSON比XML更小、更快、更易解析,因此在网络传输中,尤其是Web前端中运用非常广泛JSON使用JavaScript语法来描述数据对象,但仍然独立于语言和平台简单的JSON语法包括: JSON数据的书写格式是“(名称/值)”对,格式为名称:值,如"name" : "qiye"JSON值:可以是数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true,false)、数组(在方括号中)、对象(在花括号中)、nullJSON对象:在花括号中书写,可以包含多个(名称/值)对,如{"name":"qiye", "age":"20"}JSON数组:在方括号中书写,可以包含多个对象,如{"reader":[{"name":"qiye", "age":"20"}, {"name":"marry", "age":"21"}]}中的reader对象

2.2 HTTP标准

HTTP协议(HyperText Transfer Protocol,超文本传输协议)适用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,减少网络传输。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

2.2.1 HTTP请求过程

HTTP协议采取的是请求响应模型,永远是客户端发送请求,服务器回送响应HTTP协议是一个无状态协议,同一个客户端的这次请求和上次请求没有对应关系一次HTTP操作称为一个事务,执行过程可以分为4步: 首先客户端与服务器需要建立连接建立连接后,客户端发送一个请求给服务器。请求方法的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息,包括请求修饰符、客户机信息和可能的内容服务器接收到请求后,给予相应的响应信息。其格式为一个状态行,包括信息的协议版本号、一个成果或错误的代码,后边是MIME信息,包括服务器信息、实体信息和可能的内容客户端接收服务器所返回的信息,通过浏览器将信息显示在用户的显示屏上,然后客户端与服务器断开连接 如果以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,在显示屏输出。这些过程是由HTTP协议自己完成的。

2.2.2 HTTP状态码含义

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。在浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

HTTP状态码主要是为了标识此次HTTP请求的运行状态,常用HTTP状态码如下:

200:请求成功301:资源(网页等)被永久转移到其他URL404:请求的资源(网页等)不存在500:内部服务器错误

HTTP状态码由3个十进制数字组成,第一个十进制数字定义了状态码的类型

分类描述1**信息,服务器收到请求,需要请求者继续执行操作2**成功,操作被成功接收并处理3**重定向,需要进一步的操作以完成请求4**客户端错误,请求包含语法错误或无法完成请求5**服务器错误,服务器在处理请求的过程中发生了错误

全部的HTTP状态码信息可查询HTTP协议标准手册

2.2.3 HTTP头部信息

HTTP头部信息由众多的头域组成,每个头域由一个域名、冒号和域值三部分组成

域名是大小写无关的域值前可以添加任何数量的空格符头部可以被扩展为多行,在每行开始出,至少使用一个空格或制表符

访问博客园的HTTP请求:

GET / HTTP/1.1 Host: www.cnblogs.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive If-Modified-Since: Sun, 30 Oct 2016 10:13:18 GMT GET:请求方式,HTTP/1.1表示使用HTTP1.1协议标准Host:用于指定请求资源的Internet主机和端口号,必须表示请求URL的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回User-Agent:包含发出请求的用户信息,其中有使用的浏览器型号、版本和操作系统的信息Accept:用于指定客户端接受哪些类型的信息。例如image/gif表示用户希望接受GIF图像格式的资源,text/html表示希望接受HTML文本Accept-Language:类似于Accept,但指定的内容是一种自然语言。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受Accept-Encoding:类似于Accept,但指定的内容是可接受的内容编码。如果请求消息中没有设置这个报头域,服务器假定客户端对各种内容编码都可以接受Connection:指定连接的选项。keep-alive或closeIf-Modified-Since:在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器把这个时间与服务器上实际文件的最后修改时间进行比较,若时间一致,则返回HTTP状态码304,否则返回200和新的文件内容。客户端根据返回的状态码,判断是否需要更新缓存页面,并选择浏览器显示的内容

服务器的响应头信息:

HTTP/1.1 200 OK Date: Sum, 30 Oct 2016 10:13:50 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding Cache-Control: public, max-age=3 Expires: Sun, 30 Oct 2016 10:13:54 GMT Last-Modified: Sun, 30 Oct 2016 10:13:24 GMT Content-Encoding: gzip HTTP/1.1:表示使用HTTP1.1协议标准;200 OK说明请求成功Date:消息产生的日期和时间Content-Type:用于指明发送给接收者的实体正文的媒体类型。text/html; charset=utf-8表示HTML文本文档,UTF-8编码Transfer-Encoding:chunked表示输出的内容长度不能确定Connection:指定连接的选项。keep-alive或closeVary:指定了一些请求头域,用来决定当缓存中存在一个响应,且该缓存没有过期失效时,是否允许利用此响应去回复后续请求而不需要重复验证Cache-Control:指定缓存指令。缓存指令是单向且独立的。 请求时的缓存指令包括:no-cache(用于指示请求或相应的消息不能缓存)、max-age、max-stale、min-fresh、only-if-cached响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage Expires:给出响应过期的日期和时间。控制代理服务器或浏览器更新缓存。在过期时间之前,再次访问曾经访问过的页面时,可以直接从缓存中加载。Last-Modified:指示资源的最后修改日期和时间Content-Encoding:用作媒体类型的修饰符,指示已经被应用到实体正文的附加内容的编码。

HTTP消息报头主要包括:普通报头、请求报头、响应报头、实体报头

在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息,和对Request-URI所标识的资源进行下一步访问的信息请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成(二者可以分开发送,比如只发送实体报头域)。实体报头定义了关于实体正文和请求所标识的资源的元信息

常见普通报头

头域含义Cache-Control用于指定缓存指令Date表示消息产生的日期和时间Connection指定连接的选项,keep-alive或close

常见请求报头

头域含义Accept用于指定客户端接受哪些类型的信息Accept-Charset用于指定客户端接受的字符集Accept-Encoding用于指定可接受的内容编码Accept-Language用于指定一种自然语言Authorization用于证明客户端有权查看某个资源Host用于指定被请求资源的Internet主机和端口号,通常从HTTP URL中提取出来User-Agent允许客户端将它的操作系统、浏览器和其他属性告诉服务器

常见响应报头

头域含义Location用于重定向接收者到一个新的位置Server包含了服务器用来处理请求的软件信息,与User-Agent请求报头域是相对应的WWW-Authenticate此响应报头域必须被包含在401(未授权的)响应消息中。客户端收到401响应消息,并发送Authorization报头域请求服务器对其进行验证时,服务器端响应报头就包含该报头域

常见实体报头

头域含义Content-Encoding被用作媒体类型的修饰符,指示已经被应用到实体正文的附加内容的编码Content-Language描述了资源所用的自然语言Content-Length用于指明实体正文的长度,以字节方式存储的十进制数字表示Content-Type用于指明发送给接收者的实体正文的媒体类型Last-Modified用于指示资源的最后修改日期和时间Expires给出响应过期的日期和时间

2.2.4 Cookie状态管理

Cookie和Session是保存客户端状态信息的机制,用于解决HTTP的无状态问题Cookie将状态保存在客户端,Session将状态保存在服务器端Cookie是服务器在本地机器上存储的小段文本,并随每一个请求发送至同一个服务器浏览器会解析服务器的HTTP头中包含的Cookie,并将它们保存为一个本地文件,它会自动将同一服务器的任何请求绑定上这些Cookie服务器给每个Session分配一个唯一的JESSSIONID,并通过Cookie发送给客户端。当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID,这样服务器就能够找到这个客户端对应的Session

2.2.5 HTTP请求方式

HTTP的请求方法包括:

GETPOSTHEADPUTDELETEOPTIONSTRACECONNECT

其中最常用的是GET和POST:

GET:是以实体的方式得到由请求URL所指定资源的信息。如果请求URL指示一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述POST:用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当做请求队列中请求URL所指定资源的附加新子项在客户端,GET方式通过URL提交数据,数据在URL中可以看到;POST方式,数据放在实体区内提交GET方式提交的数据最多只能有1024字节,而POST没有限制安全性:使用GET的时候,参数会显示在地址栏上,而POST不会。所以对于非敏感数据,使用GET;对于敏感数据,使用POST。

一个POST请求示例:

POST /login/phone_num HTTP/1.1 Host: www.zhihu.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0 Accept: */* Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br X-Xsrftoken: ade0896dc13cc3b2204a8f7742ad7f48 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With: XMLHttpRequest Referer: https://www.zhihu.com/ Content-Length: 117 Cookie:q_c1=7bc53a12dd7942d3b64776441ab69983|1477975324000|1465870098000;d_c0="ACAAa1M-EwqPTgdv2RIP3IIzHO2R7zKBGpw=|1465870098";__utma=51854390.1118849962.1465870098.1466355392.1477975329.3;__utmz=51854390.1465870098.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);__utmv=51854390.000--|3=entry_date=20160614=1;_zap=7514ab27-5b42-4c95-a4cc-e31ce5757e14;_za=4ab6eb3b-c34f-4772-aac2-7182f21894cb;_xsrf=ade0896dc13cc3b2204a8f7742ad7f48;l_cap_id="ZjBkODkyYjdiZWZkNDQ2NWE4YzI1ZTk3Njc0MDZlMWM=|1477975324|95c5032340720551391178c9ee67cd8a3e2849d5";cap_id="ZjAxNjBmNzU5NzZkNDI2ZTlkYTk3ZDVlNDNhNzgyZTA=|1477975324|0616dfa45cd15d66fe792484c6ae0af71557cb3c";n_c=1;__utmb=51854390.2.10.1477975328;__utmc=51854390;__utmt=1; login="ZWU1NTFlM2EzTYzg4NDNjNzlhODYwN2ZhYzgyZmExOTE=|1477975348|735a805117328df9e557f0126eb348e7712e310c" Connection: keep-alive _xsrf=ade0896dc13cc3b2204a8f7742ad7f48&password=xxxxxxxx&captcha_type=cn&remember_me=true&phone_num=xxxxxxxx
最新回复(0)