Web網(wǎng)頁端基礎(chǔ)

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 所示。

image.png

圖 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)容殴泰。

image.png

圖 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 所示。

image.png

圖 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)容慎冤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沧卢,隨后出現(xiàn)的幾起案子蚁堤,更是在濱河造成了極大的恐慌,老刑警劉巖但狭,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件披诗,死亡現(xiàn)場離奇詭異,居然都是意外死亡立磁,警方通過查閱死者的電腦和手機呈队,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唱歧,“玉大人宪摧,你說我怎么就攤上這事÷溃” “怎么了几于?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沿后。 經(jīng)常有香客問我沿彭,道長,這世上最難降的妖魔是什么尖滚? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任膝蜈,我火速辦了婚禮锅移,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饱搏。我一直安慰自己非剃,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布推沸。 她就那樣靜靜地躺著备绽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鬓催。 梳的紋絲不亂的頭發(fā)上肺素,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音宇驾,去河邊找鬼倍靡。 笑死,一個胖子當著我的面吹牛课舍,可吹牛的內(nèi)容都是我干的塌西。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼筝尾,長吁一口氣:“原來是場噩夢啊……” “哼捡需!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筹淫,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤站辉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后损姜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饰剥,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年摧阅,在試婚紗的時候發(fā)現(xiàn)自己被綠了汰蓉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡逸尖,死狀恐怖古沥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娇跟,我是刑警寧澤岩齿,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站苞俘,受9級特大地震影響盹沈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一乞封、第九天 我趴在偏房一處隱蔽的房頂上張望做裙。 院中可真熱鬧,春花似錦肃晚、人聲如沸锚贱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拧廊。三九已至,卻和暖如春晋修,著一層夾襖步出監(jiān)牢的瞬間吧碾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工墓卦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留倦春,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓落剪,卻偏偏與公主長得像睁本,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子著榴,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354