2. 網(wǎng)頁基礎(chǔ)
用瀏覽器訪問網(wǎng)站時,頁面各不相同按灶,你有沒有想過它為何會呈現(xiàn)這個樣子呢症革?本節(jié)中,我們就來了解一下網(wǎng)頁的基本組成鸯旁、結(jié)構(gòu)和節(jié)點等內(nèi)容噪矛。
2.2.1 網(wǎng)頁的組成
網(wǎng)頁可以分為三大部分 —— HTML、CSS 和 JavaScript铺罢。如果把網(wǎng)頁比作一個人的話艇挨,HTML 相當于骨架,JavaScript 相當于肌肉韭赘,CSS 相當于皮膚缩滨,三者結(jié)合起來才能形成一個完善的網(wǎng)頁。下面我們分別來介紹一下這三部分的功能。
1. HTML
HTML 是用來描述網(wǎng)頁的一種語言脉漏,其全稱叫作 Hyper Text Markup Language苞冯,即超文本標記語言。網(wǎng)頁包括文字侧巨、按鈕舅锄、圖片和視頻等各種復雜的元素,其基礎(chǔ)架構(gòu)就是 HTML司忱。不同類型的元素通過不同類型的標簽來表示巧娱,如圖片用 img 標簽表示,視頻用 video 標簽表示烘贴,段落用 p 標簽表示禁添,它們之間的布局又常通過布局標簽 div 嵌套組合而成,各種標簽通過不同的排列和嵌套才形成了網(wǎng)頁的框架桨踪。
在 Chrome 瀏覽器中打開百度老翘,右擊并選擇 “檢查” 項(或按 F12 鍵),打開開發(fā)者模式锻离,這時在 Elements 選項卡中即可看到網(wǎng)頁的源代碼铺峭,如圖 2-9 所示。
圖 2-9 源代碼
這就是 HTML汽纠,整個網(wǎng)頁就是由各種標簽嵌套組合而成的卫键。這些標簽定義的節(jié)點元素相互嵌套和組合形成了復雜的層次關(guān)系,就形成了網(wǎng)頁的架構(gòu)虱朵。
2. CSS
HTML 定義了網(wǎng)頁的結(jié)構(gòu)莉炉,但是只有 HTML 頁面的布局并不美觀,可能只是簡單的節(jié)點元素的排列碴犬,為了讓網(wǎng)頁看起來更好看一些絮宁,這里借助了 CSS。
CSS服协,全稱叫作 Cascading Style Sheets绍昂,即層疊樣式表〕ズ桑“層疊” 是指當在 HTML 中引用了數(shù)個樣式文件窘游,并且樣式發(fā)生沖突時,瀏覽器能依據(jù)層疊順序處理跳纳∪淌危“樣式” 指網(wǎng)頁中文字大小、顏色棒旗、元素間距喘批、排列等格式。
CSS 是目前唯一的網(wǎng)頁頁面排版樣式標準铣揉,有了它的幫助饶深,頁面才會變得更為美觀。
圖 2-9 的右側(cè)即為 CSS逛拱,例如:
#head_wrapper.s-ps-islite .s-p-top {
position: absolute;
bottom: 40px;
width: 100%;
height: 181px;
}
就是一個 CSS 樣式敌厘。大括號前面是一個 CSS 選擇器。此選擇器的意思是首先選中 id 為 head_wrapper 且 class 為 s-ps-islite 的節(jié)點朽合,然后再選中其內(nèi)部的 class 為 s-p-top 的節(jié)點俱两。大括號內(nèi)部寫的就是一條條樣式規(guī)則,例如 position 指定了這個元素的布局方式為絕對布局曹步,bottom 指定元素的下邊距為 40 像素宪彩,width 指定了寬度為 100% 占滿父元素,height 則指定了元素的高度讲婚。也就是說尿孔,我們將位置、寬度筹麸、高度等樣式配置統(tǒng)一寫成這樣的形式活合,然后用大括號括起來,接著在開頭再加上 CSS 選擇器物赶,這就代表這個樣式對 CSS 選擇器選中的元素生效白指,元素就會根據(jù)此樣式來展示了。
在網(wǎng)頁中酵紫,一般會統(tǒng)一定義整個網(wǎng)頁的樣式規(guī)則告嘲,并寫入 CSS 文件中(其后綴為 c ss)。在 HTML 中奖地,只需要用 link 標簽即可引入寫好的 CSS 文件状蜗,這樣整個頁面就會變得美觀、優(yōu)雅鹉动。
3. JavaScript
JavaScript轧坎,簡稱 JS,是一種腳本語言泽示。HTML 和 CSS 配合使用缸血,提供給用戶的只是一種靜態(tài)信息,缺乏交互性械筛。我們在網(wǎng)頁里可能會看到一些交互和動畫效果捎泻,如下載進度條、提示框埋哟、輪播圖等笆豁,這通常就是 JavaScript 的功勞郎汪。它的出現(xiàn)使得用戶與信息之間不只是一種瀏覽與顯示的關(guān)系,而是實現(xiàn)了一種實時闯狱、動態(tài)煞赢、交互的頁面功能。
JavaScript 通常也是以單獨的文件形式加載的哄孤,后綴為 js照筑,在 HTML 中通過 script 標簽即可引入,例如:
<script src="jquery-2.1.0.js"></script>
綜上所述瘦陈,HTML 定義了網(wǎng)頁的內(nèi)容和結(jié)構(gòu)凝危,CSS 描述了網(wǎng)頁的布局,JavaScript 定義了網(wǎng)頁的行為晨逝。
2.2.2 網(wǎng)頁的結(jié)構(gòu)
我們首先用例子來感受一下 HTML 的基本結(jié)構(gòu)蛾默。新建一個文本文件,名稱可以自取捉貌,后綴為 html趴生,內(nèi)容如下:
<!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 實例。開頭用 DOCTYPE 定義了文檔類型昏翰,其次最外層是 html 標簽苍匆,最后還有對應(yīng)的結(jié)束標簽來表示閉合,其內(nèi)部是 head 標簽和 body 標簽棚菊,分別代表網(wǎng)頁頭和網(wǎng)頁體浸踩,它們也需要結(jié)束標簽。head 標 簽內(nèi)定義了一些頁面的配置和引用统求,如:
<meta charset="UTF-8">
它指定了網(wǎng)頁的編碼為 UTF-8检碗。
title 標簽則定義了網(wǎng)頁的標題,會顯示在網(wǎng)頁的選項卡中码邻,不會顯示在正文中折剃。body 標簽內(nèi)則是在網(wǎng)頁正文中顯示的內(nèi)容。div 標簽定義了網(wǎng)頁中的區(qū)塊像屋,它的 id 是 container怕犁,這是一個非常常用的屬性,且 id 的內(nèi)容在網(wǎng)頁中是唯一的己莺,我們可以通過它來獲取這個區(qū)塊奏甫。然后在此區(qū)塊內(nèi)又有一個 div 標簽,它的 class 為 wrapper凌受,這也是一個非常常用的屬性阵子,經(jīng)常與 CSS 配合使用來設(shè)定樣式。然后此區(qū)塊內(nèi)部又有一個 h2 標簽胜蛉,這代表一個二級標題挠进。另外色乾,還有一個 p 標簽,這代表一個段落领突。在這兩者中直接寫入相應(yīng)的內(nèi)容即可在網(wǎng)頁中呈現(xiàn)出來暖璧,它們也有各自的 class 屬性。
將代碼保存后攘须,在瀏覽器中打開該文件,可以看到如圖 2-10 所示的內(nèi)容殴泰。
圖 2-10 運行結(jié)果
可以看到于宙,在選項卡上顯示了 This is a Demo 字樣,這是我們在 head 中的 title 里定義的文字悍汛。而網(wǎng)頁正文是 body 標簽內(nèi)部定義的各個元素生成的捞魁,可以看到這里顯示了二級標題和段落。
這個實例便是網(wǎng)頁的一般結(jié)構(gòu)离咐。一個網(wǎng)頁的標準形式是 html 標簽內(nèi)嵌套 head 和 body 標簽谱俭,head 內(nèi)定義網(wǎng)頁的配置和引用,body 內(nèi)定義網(wǎng)頁的正文宵蛀。
2.2.3 節(jié)點樹及節(jié)點間的關(guān)系
在 HTML 中昆著,所有標簽定義的內(nèi)容都是節(jié)點,它們構(gòu)成了一個 HTML DOM 樹术陶。
我們先看下什么是 DOM凑懂。DOM 是 W3C(萬維網(wǎng)聯(lián)盟)的標準,其英文全稱 Document Object Model梧宫,即文檔對象模型接谨。它定義了訪問 HTML 和 XML 文檔的標準:
W3C 文檔對象模型(DOM)是中立于平臺和語言的接口,它允許程序和腳本動態(tài)地訪問和更新文檔的內(nèi)容塘匣、結(jié)構(gòu)和樣式脓豪。
W3C DOM 標準被分為 3 個不同的部分:
- 核心 DOM - 針對任何結(jié)構(gòu)化文檔的標準模型
- XML DOM - 針對 XML 文檔的標準模型
- HTML DOM - 針對 HTML 文檔的標準模型
根據(jù) W3C 的 HTML DOM 標準,HTML 文檔中的所有內(nèi)容都是節(jié)點:
- 整個文檔是一個文檔節(jié)點
- 每個 HTML 元素是元素節(jié)點
- HTML 元素內(nèi)的文本是文本節(jié)點
- 每個 HTML 屬性是屬性節(jié)點
- 注釋是注釋節(jié)點
HTML DOM 將 HTML 文檔視作樹結(jié)構(gòu)忌卤,這種結(jié)構(gòu)被稱為節(jié)點樹扫夜,如圖 2-11 所示。
圖 2-11 節(jié)點樹
通過 HTML DOM驰徊,樹中的所有節(jié)點均可通過 JavaScript 訪問历谍,所有 HTML 節(jié)點元素均可被修改,也可以被創(chuàng)建或刪除辣垒。
節(jié)點樹中的節(jié)點彼此擁有層級關(guān)系望侈。我們常用父(parent)、子(child)和兄弟(sibling)等術(shù)語描述這些關(guān)系勋桶。父節(jié)點擁有子節(jié)點脱衙,同級的子節(jié)點被稱為兄弟節(jié)點侥猬。
在節(jié)點樹中,頂端節(jié)點稱為根(root)捐韩。除了根節(jié)點之外退唠,每個節(jié)點都有父節(jié)點,同時可擁有任意數(shù)量的子節(jié)點或兄弟節(jié)點荤胁。圖 2-12 展示了節(jié)點樹以及節(jié)點之間的關(guān)系瞧预。
圖 2-12 節(jié)點樹及節(jié)點間的關(guān)系
本段參考 W3SCHOOL,鏈接:http://www.w3school.com.cn/htmldom/dom_nodes.asp仅政。
2.2.4 選擇器
我們知道網(wǎng)頁由一個個節(jié)點組成垢油,CSS 選擇器會根據(jù)不同的節(jié)點設(shè)置不同的樣式規(guī)則,那么怎樣來定位節(jié)點呢圆丹?
在 CSS 中滩愁,我們使用 CSS 選擇器來定位節(jié)點。例如辫封,上例中 div 節(jié)點的 id 為 container硝枉,那么就可以表示為 #container,其中 # 開頭代表選擇 id倦微,其后緊跟 id 的名稱妻味。另外,如果我們想選擇 class 為 wrapper 的節(jié)點欣福,便可以使用.wrapper弧可,這里以點(.)開頭代表選擇 class,其后緊跟 class 的名稱劣欢。另外棕诵,還有一種選擇方式,那就是根據(jù)標簽名篩選凿将,例如想選擇二級標題校套,直接用 h2 即可。這是最常用的 3 種表示牧抵,分別是根據(jù) id笛匙、class、標簽名篩選犀变,請牢記它們的寫法妹孙。
另外,CSS 選擇器還支持嵌套選擇获枝,各個選擇器之間加上空格分隔開便可以代表嵌套關(guān)系蠢正,如 #container .wrapper p 則代表先選擇 id 為 container 的節(jié)點,然后選中其內(nèi)部的 class 為 wrapper 的節(jié)點省店,然后再進一步選中其內(nèi)部的 p 節(jié)點嚣崭。另外笨触,如果不加空格,則代表并列關(guān)系雹舀,如 div#container .wrapper p.text 代表先選擇 id 為 container 的 div 節(jié)點芦劣,然后選中其內(nèi)部的 class 為 wrapper 的節(jié)點,再進一步選中其內(nèi)部的 class 為 text 的 p 節(jié)點说榆。這就是 CSS 選擇器虚吟,其篩選功能還是非常強大的肾档。
另外掠剑,CSS 選擇器還有一些其他語法規(guī)則脊另,具體如表 2-4 所示茧妒。
表 2-4 CSS 選擇器的其他語法規(guī)則
選 擇 器 | 例 子 | 例子描述 |
---|---|---|
.class | .intro | 選擇 class="intro" 的所有節(jié)點 |
#id | #firstname | 選擇 id="firstname" 的所有節(jié)點 |
* | * | 選擇所有節(jié)點 |
element | p | 選擇所有 p 節(jié)點 |
element,element | div,p | 選擇所有 div 節(jié)點和所有 p 節(jié)點 |
element element | div p | 選擇 div 節(jié)點內(nèi)部的所有 p 節(jié)點 |
element>element | div>p | 選擇父節(jié)點為 div 節(jié)點的所有 p 節(jié)點 |
element+element | div+p | 選擇緊接在 div 節(jié)點之后的所有 p 節(jié)點 |
[attribute] | [target] | 選擇帶有 target 屬性的所有節(jié)點 |
[attribute=value] | [target=blank] | 選擇 target="blank" 的所有節(jié)點 |
[attribute~=value] | [title~=flower] | 選擇 title 屬性包含單詞 flower 的所有節(jié)點 |
:link | a:link | 選擇所有未被訪問的鏈接 |
:visited | a:visited | 選擇所有已被訪問的鏈接 |
:active | a:active | 選擇活動鏈接 |
:hover | a:hover | 選擇鼠標指針位于其上的鏈接 |
:focus | input:focus | 選擇獲得焦點的 input 節(jié)點 |
:first-letter | p:first-letter | 選擇每個 p 節(jié)點的首字母 |
:first-line | p:first-line | 選擇每個 p 節(jié)點的首行 |
:first-child | p:first-child | 選擇屬于父節(jié)點的第一個子節(jié)點的所有 p 節(jié)點 |
:before | p:before | 在每個 p 節(jié)點的內(nèi)容之前插入內(nèi)容 |
:after | p:after | 在每個 p 節(jié)點的內(nèi)容之后插入內(nèi)容 |
:lang(language) | p:lang | 選擇帶有以 it 開頭的 lang 屬性值的所有 p 節(jié)點 |
element1~element2 | p~ul | 選擇前面有 p 節(jié)點的所有 ul 節(jié)點 |
[attribute^=value] | a[src^="https"] | 選擇其 src 屬性值以 https 開頭的所有 a 節(jié)點 |
[attribute$=value] | a[src$=".pdf"] | 選擇其 src 屬性以.pdf 結(jié)尾的所有 a 節(jié)點 |
[attribute*=value] | a[src*="abc"] | 選擇其 src 屬性中包含 abc 子串的所有 a 節(jié)點 |
:first-of-type | p:first-of-type | 選擇屬于其父節(jié)點的首個 p 節(jié)點的所有 p 節(jié)點 |
:last-of-type | p:last-of-type | 選擇屬于其父節(jié)點的最后 p 節(jié)點的所有 p 節(jié)點 |
:only-of-type | p:only-of-type | 選擇屬于其父節(jié)點唯一的 p 節(jié)點的所有 p 節(jié)點 |
:only-child | p:only-child | 選擇屬于其父節(jié)點的唯一子節(jié)點的所有 p 節(jié)點 |
:nth-child(n) | p:nth-child | 選擇屬于其父節(jié)點的第二個子節(jié)點的所有 p 節(jié)點 |
:nth-last-child(n) | p:nth-last-child | 同上,從最后一個子節(jié)點開始計數(shù) |
:nth-of-type(n) | p:nth-of-type | 選擇屬于其父節(jié)點第二個 p 節(jié)點的所有 p 節(jié)點 |
:nth-last-of-type(n) | p:nth-last-of-type | 同上豪筝,但是從最后一個子節(jié)點開始計數(shù) |
:last-child | p:last-child | 選擇屬于其父節(jié)點最后一個子節(jié)點的所有 p 節(jié)點 |
:root | :root | 選擇文檔的根節(jié)點 |
:empty | p:empty | 選擇沒有子節(jié)點的所有 p 節(jié)點(包括文本節(jié)點) |
:target | #news:target | 選擇當前活動的 #news 節(jié)點 |
:enabled | input:enabled | 選擇每個啟用的 input 節(jié)點 |
:disabled | input:disabled | 選擇每個禁用的 input 節(jié)點 |
:checked | input:checked | 選擇每個被選中的 input 節(jié)點 |
:not(selector) | :not | 選擇非 p 節(jié)點的所有節(jié)點 |
::selection | ::selection | 選擇被用戶選取的節(jié)點部分 |
另外,還有一種比較常用的選擇器是 XPath,這種選擇方式后面會詳細介紹油宜。
本節(jié)介紹了網(wǎng)頁的基本結(jié)構(gòu)和節(jié)點間的關(guān)系,了解了這些內(nèi)容怜姿,我們才有更加清晰的思路去解析和提取網(wǎng)頁內(nèi)容慎冤。