Python爬蟲開發與專案實戰(2)
第二章 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、mm
- height屬性用來指定圖片的高度,單位為px、em、cm、mm
- border屬性用來指定圖片的邊框寬度,單位為px、em、cm、mm
- alt屬性有兩個作用:
- 如果影像沒有下載或者載入失敗,會用文字來代替影像顯示
- 搜尋引擎可以通過這個屬性的文字來抓取圖片
-
例如部落格園首頁圖片的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標記中的顏色設定為藍色,字型大小為12px
- h1:選擇器
- 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:#f60
- RGB方式:color:rgb(255, 255, 255)
- RGBA方式:color:rgba(255, 255, 255, 1)
字型屬性
- 可以使用字型屬性定義文字形式:
- font-size定義字型大小。如:font-size:14px
- font-family定義字型。字型之間可以使用“,”隔開,以確保當字型不存在時直接使用下一個字型。如:font-family:微軟雅黑, serif
- font-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、right
- line-height:設定文字行高,取值可以取具體數值,也可以取基於字型大小的百分比行高
- text-indent:首行縮排,如text-indent:50px
- letter-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; // true false === 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’); // 返回19
- add(); // 返回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 選取根元素classroom classroom/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)、陣列(在方括號中)、物件(在花括號中)、null
- JSON物件:在花括號中書寫,可以包含多個(名稱/值)對,如
{"name":"qiye", "age":"20"}
- JSON陣列:在方括號中書寫,可以包含多個物件,如
{"reader":[{"name":"qiye", "age":"20"}, {"name":"marry", "age":"21"}]}
中的reader物件
- JSON資料的書寫格式是“(名稱/值)”對,格式為
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:資源(網頁等)被永久轉移到其他URL
- 404:請求的資源(網頁等)不存在
- 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或close
- If-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或close
- Vary:指定了一些請求頭域,用來決定當快取中存在一個響應,且該快取沒有過期失效時,是否允許利用此響應去回覆後續請求而不需要重複驗證
- 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的請求方法包括:
- GET
- POST
- HEAD
- PUT
- DELETE
- OPTIONS
- TRACE
- CONNECT
-
其中最常用的是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
相關文章
- Python爬蟲開發與專案實戰pdfPython爬蟲
- Python爬蟲開發與專案實戰(1)Python爬蟲
- Python爬蟲開發與專案實戰——基礎爬蟲分析Python爬蟲
- Python爬蟲開發與專案實戰 3: 初識爬蟲Python爬蟲
- python爬蟲實操專案_Python爬蟲開發與專案實戰 1.6 小結Python爬蟲
- Python爬蟲開發與專案實戰 2:Web前端基礎Python爬蟲Web前端
- Python爬蟲開發與專案實戰--分散式程式Python爬蟲分散式
- 不踩坑的Python爬蟲:Python爬蟲開發與專案實戰,從爬蟲入門 PythonPython爬蟲
- Python爬蟲開發與專案實戰 4: HTML解析大法Python爬蟲HTML
- python書籍推薦-Python爬蟲開發與專案實戰Python爬蟲
- Python爬蟲開發與專案實踐(3)Python爬蟲
- 視訊教程-Python網路爬蟲開發與專案實戰-PythonPython爬蟲
- 《Python爬蟲開發與專案實戰》總結 第二章Python爬蟲
- Python大型網路爬蟲專案開發實戰(全套)Python爬蟲
- Python爬蟲開發與專案實戰 1:回顧Python程式設計Python爬蟲程式設計
- 完整的python專案例項-《Python爬蟲開發與專案實戰》pdf完整版Python爬蟲
- python爬蟲-33個Python爬蟲專案實戰(推薦)Python爬蟲
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- python專案開發例項-Python專案案例開發從入門到實戰——爬蟲、遊戲Python爬蟲遊戲
- python爬蟲實戰教程-Python爬蟲開發實戰教程(微課版)Python爬蟲
- 爬蟲專案實戰(一)爬蟲
- 爬蟲實戰專案集合爬蟲
- 爬蟲實戰專案合集爬蟲
- python3網路爬蟲開發實戰_Python3 爬蟲實戰Python爬蟲
- Python網路爬蟲實戰小專案Python爬蟲
- Python網路爬蟲實戰專案大全!Python爬蟲
- Python開發爬蟲專案+程式碼Python爬蟲
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- Go語言專案實戰:併發爬蟲Go爬蟲
- 《python 爬蟲開發與實戰》html基礎詳解Python爬蟲HTML
- Python 爬蟲實戰(2):股票資料定向爬蟲Python爬蟲
- Python靜態網頁爬蟲專案實戰Python網頁爬蟲
- 《Python3網路爬蟲開發實戰》教程||爬蟲教程Python爬蟲
- Python 3網路爬蟲開發實戰Python爬蟲
- 精通 Python 網路爬蟲:核心技術、框架與專案實戰Python爬蟲框架
- python3網路爬蟲開發實戰_Python 3開發網路爬蟲(一)Python爬蟲
- Python爬蟲入門學習實戰專案(一)Python爬蟲
- [Python3網路爬蟲開發實戰] 分散式爬蟲原理Python爬蟲分散式