两万字详细爬虫知识储备,数据采集与清洗基础习题(一)头歌参考答案
數據采集習題參考答案,會持續更新,點個關注防丟失。為了方便尋找,按照頭歌的門類從新整理了實訓的分類,朋友們記得看標題哦,按標題尋找! 該篇為爬蟲知識儲備!
文章目錄
實訓一:HTML基礎
第一關:初識HTML:簡單的Hello World網頁制作
第一關答案?
第二關:HTML結構:自我簡介網頁?
第二關答案?
實訓二:HTML文本
第一關:HTML鏈接:帶超鏈接的網頁
第一關答案?
第二關:HTML標題與段落:網絡文章網頁
第二關答案?
第三關:HTML表格:日常消費賬單表格展示網頁
?第三關答案
實訓三:HTML——基本標簽
第一關創建第一個 HTML 標簽
第一關答案?
第二關:創建?<h1>-<h6>
第二關答案?
第三關創建 p 標簽
第三關答案?
第四關創建 a 標簽
第四關答案?
第五關創建 img 標簽
第五關答案?
第六關創建 div 標簽
第六關答案?
第七關添加注釋
第七關答案?
實訓四:HTTP基礎
第一關HTTP 標準
第一關答案?
第二關開發者工具的基本使用
第二關答案
實訓五:Python——JSON基礎?
第一關JSON篇:JSON基礎知識
第一關答案?
第二關JSON篇:使用json庫
實訓六:Python——XPath基礎?
第一關:XPath 路徑表達式
第一關答案
第二關:XPath 軸定位
第二關答案
第三關:XPath 解析
第三關答案
HTML(Hypertext Markup Language,超文本標記語言)是一種用于創建Web頁面和Web應用的標準化標記語言。在CSS(Cascading Style Sheets,級聯樣式表單)和JavaScript的幫助下,HTML已經成功構建了一整套面向Web的開發與應用平臺。
自1995年HTML2.0面世,HTML陸續推出了得到廣泛應用的HTML3.2和HTML4.0標準,2014年HTML5標準的面世使其在多媒體和移動性方面得到了全面提升,使HTML迎來了新的爆發式發展。
本習題面向零基礎、入門級的Web技術學員,將介紹HTML的基本概念和結構,體驗一個簡單的Hello World網頁制作過程,以及一個相對完整的Web頁面的制作過程。
實訓一:HTML基礎
第一關:初識HTML:簡單的Hello World網頁制作
本關的任務是編寫一個簡單的HTML頁面,這個網頁包含一個標題和一個段落。顯示效果如下:
HTML是一種標準化的標記語?,由一套標記標簽(markup tag)組成。Web前端開發人員的一項主要工作就是利用HTML標簽來編寫?頁,將文本、超鏈接、圖片、語音、視頻等各種內容整合起來,實現絢麗多姿的網頁。
下面是大家需要記住的關于HTML的一些基本描述:
-
HTML標記標簽,通常簡稱HTML標簽;
-
HTML文檔,通常簡稱HTML頁面、網頁等;
-
HTML5能夠較好的兼容HTML之前版本,但也廢棄了一些舊的HTML特性。
-
<html>、</html>,<body>,</body>,<h1>,<p>等都是HTML標簽;
-
<h1>這是一個一級標題</h1>,<p>這是第1個段落。</p>等都是HTML元素;
-
bgcolor="yellow"、align="center"都是HTML元素的屬性。
第一關答案?
<!DOCTYPE html> <html><head><meta charset="utf-8"><title>Hello World</title></head> <!--------- Begin--------><body bgcolor='F6F3D6'><!Hello World!--><h1 align ='center'>Hello World</h1><p align ='center'>動手改變世界</p></body><!--------- End--------></html>第二關:HTML結構:自我簡介網頁?
本關任務是編寫一個自我簡介網頁,你將通過本任務理解一個HTML網頁的完整結構,并了解如何讓搜索引擎更好的找到你的網頁。
顯示效果如下圖所示:
根元素:HTML 元素
然后,<HTML>元素告知瀏覽器其本身是一個HTML文檔。
除去第一行外,其余的頁面內容都應該包含在<HTML>元素中,所以它也被稱為根元素。
頭元素:head 元素
與屬性會給元素增添附加信息一樣,head元素能為整個網頁增添更多信息。可以用在head中的標簽有<base>, <link>, <meta>, <script>, <style>, 以及 <title>。在之后的學習中,你將逐漸的了解它們。
網頁標題元素:title
本例網頁主要內容是“自我簡介”,所以title也設置為“自我簡介”。 title元素的內容即網頁標題,它是一個網頁必需的元素之一。
<title>的內容一般作為網頁標簽名,寫法如下:
<title>標題內容</title>
第二關答案?
<!DOCTYPE html> <html><!--------- Begin--------><head><title>自我簡介</title><meta charset="utf-8"><meta name="description" content="彭智廣的自我簡介網站"><meta name="keywords" content="自我簡介,姓名,學號,班級"></head><body><h1 align="center">自我簡介</h1><h2>簡介</h2><p>在這里簡單的描述一下你自己吧。</p><h2>三個與你最有關的詞</h2><p>這三個詞可以是一種形容,也可以是一種運動或者是一種獨特的愛好,等等。</p><ul><li>第一個詞</li><p>選擇第一個詞的原因</p><li>第二個詞</li><p>選擇第二個詞的原因</p><li>第三個詞</li><p>選擇第三個詞的原因</p></ul> </body><!--------- End--------></html>實訓二:HTML文本
第一關:HTML鏈接:帶超鏈接的網頁
本關的任務是編寫一個帶超鏈接的HTML頁面,鏈接包含頁面內導航鏈接和跳轉其他網頁的鏈接。顯示效果如下:
超鏈接是網頁互連的核心,網頁之間通過超鏈接連接在一起。
我們使用<a> 標簽定義超鏈接。
一個簡單的例子如下:
<a href="https://baidu.com">百度搜索</a>
點擊a元素內容后打開百度搜索網頁。
其中,href屬性指定了超鏈接的目標,本例中即跳轉到百度。
屬性
href 屬性
href 屬性是超鏈接最重要的屬性,它用于指定超鏈接目標的 URL。
典型的超鏈接格式如下:
<a href="URL">
其中,目標URL有三種類型:
錨 URL (anchor URL):指向同一頁面內某一位置;
相對 URL (relative URL):指向同一網站的不同文件;
絕對 URL (absolute URL):指向另一個網站。
提示:
-
URL:Uniform Resource Locator,統一資源定位器;
-
為什么叫作錨URL呢?
錨的含義取于船上的錨,船把錨沉在水底后,如果船隨水飄移了,只要一拉錨的鎖鏈就會回到拋錨的位置。同樣的,在html中點錨鏈接就能回到指定位置。
第一關答案?
<!DOCTYPE html> <html><head><meta charset="utf-8"><title>HTML鏈接</title><meta name="description" content="HTML鏈接知識講解"><meta name="keywords" content="HTML, Link"> </head><!--------- Begin--------><body><h1>HTML 入門</h1><h2>本頁目錄</h2><ul><li><a href="#toc1">簡介</a></li><li><a href="https://en.wikipedia.org/wiki/CSS">第1關</a></li><li><a href="#toc3">第2關</a></li></ul><h2 id="#toc3">簡介</h2><p><a href="https://en.wikipedia.org/wiki/HTML"target="_blank"HTML</a>(Hypertext Markup Language,超文本標記語言)是一種用于創建Web頁面和Web應用的標準化標記語言。在<a href="https://en.wikipedia.org/wiki/CSS"target="_blank">CSS</a>(Cascading Style Sheets,級聯樣式表單)和<a href="#toc3"target="_blank">JavaScript</a>的幫助下,HTML已經成功構建了一整套面向Web的開發與應用平臺。</p><p>自1995年HTML2.0面世,HTML陸續推出了得到廣泛應用的HTML3.2和HTML4.0標準,2014年HTML5標準的面世使其在多媒體和移動性方面得到了全面提升,使HTML迎來了新的爆發式發展。</p><h2 id="toc2">第1關</h2><p>初識HTML:簡單的Hello World網頁</p><h2 id="toc3">第2關</h2><p>HTML鏈接:帶超鏈接的網頁</p><hr><p>若需幫助,請發送問題到<a href="mailto:someone@email.com">E-Mail</a>。</p><p><a href="#">回到頂部</a></p> </body><!--------- End--------></html>第二關:HTML標題與段落:網絡文章網頁
本關任務是完成一個格式豐富的文章網頁,你將通過本關學習標題、段落、文本格式化和引用等,與文本相關的標簽。
本關網頁顯示效果如下圖所示:
HTML提供了六級標題用于創建網頁信息的層級關系。<h1> 定義重要等級最高的標題,之后<h2>到<h6>層級依次遞減。
第二關答案?
<!DOCTYPE html><head><meta charset="UTF-8" /><title>HTML – 維基百科</title> </head><!--------- Begin--------><body><h1>HTML</h1><p>超文本標記語言(HTML)是一種標準化的用來創建Web頁面和Web應用的標準化的<a href="https://en.wikipedia.org/wiki/Markup_language" title="Markup language" target="_blank">標記語言</a>。 在級聯樣式表單(CSS)和JavaScript的幫助下,HTML已經成功構建了一整套面向Web的開發與應用平臺<sup><a href="#ref1">[1]</a></sup>。</p><h2>歷史</h2><h3>開發過程</h3><p>1980年,物理學家<a href="https://en.wikipedia.org/wiki/Tim_Berners-Lee" title="Tim Berners-Lee" target="_blank">Tim Berners-Lee</a>,<a href="https://en.wikipedia.org/wiki/CERN" title="CERN" target="_blank">CERN</a>的一位項目負責人,提出并實現了<a href="https://en.wikipedia.org/wiki/ENQUIRE" title="ENQUIRE" target="_blank">ENQUIRE</a>系統。該系統的目的是為CERN研究人員提供一種使用和分享文檔。1989年, Berners-Lee寫了一個備忘錄,提出了基于Internet-based<strong>超文本系統</strong><sup><a href="#ref2">[2]</a></sup>。</p><h3>HTML里程碑</h3><dl><dt>1995年11月24日</dt><dd>HTML2.0發布,對應的IETF文檔為<a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc1866" target="_blank">RFC 1866</a>。</dd><dt>1997年1月14日</dt><dd>HTML 3.2以<a href="https://en.wikipedia.org/wiki/W3C_Recommendation" class="mw-redirect" title="W3C Recommendation" target="_blank"><abbr title="World Wide Web Consortium">W3C</abbr>推薦標準</a>的形式發布。 隨后的HTML標準都由W3C組織發布。</dd><dt>1997年12月18日</dt><dd>HTML 4.0發布<sup><a href="#ref3">[3]</a></sup>。</dd><dt>2014年10月28日</dt><dd>HTML5 發布。</dd><dt>2016年11月1日</dt><dd>HTML 5.1發布。</dd></dl><h2>參考文獻</h2><ol><small><li id='ref1'>Flanagan, David. <i>JavaScript - The definitive guide</i> (6 ed.). p. 1. "JavaScript is part of the triad of technologies that all Web developers must learn: HTML to specify the content of web pages, CSS to specify the presentation of web pages, and JavaScript to specify the behaviour of web pages."</li><li id="ref2">Tim Berners-Lee, "Information Management: A Proposal." CERN (March 1989, May 1990). </li><li id="ref3">"HTML 4.0 Specification — W3C Recommendation — Conformance: requirements and recommendations". World Wide Web Consortium. December 18, 1997. Retrieved July 6, 2015.</li></small></ol> </body><!--------- End--------></html>第三關:HTML表格:日常消費賬單表格展示網頁
本關任務是編寫一個日常消費賬單表格展示網頁,你將通過本關學習如何使用HTML編寫出簡潔清晰的表格。
本關網頁顯示效果如下圖所示:
在HTML表中,一個表格(table)由行(tr)組成,每一行由單元格組成,單元格有標題單元格(th)和數據單元格(td)。
我們設定了<table>元素的width屬性,改變了表格的寬度;
我們使用<caption>元素設置了表格的標題;
數據第一行<tr>元素中,使用<th>元素指定了表頭。本例中有三列信息,所以包含了三個<th>元素;
并且,我們設置了<th>元素的屬性scope的值為col。
?第三關答案
<!DOCTYPE html> <html><!--------- Begin--------><head><meta charset="utf-8"><title>HTML表格</title><meta name="description" content="HTML表格知識講解"><meta name="keywords" content="HTML,表格, Table"><style type="text/css">table {border-collapse: collapse;}caption {font-weight: bold;margin-bottom: .5em;}th,td {padding: .5em .75em;border: 1px solid #000;}tfoot {font-weight: bold;}</style> </head><body><table width="400" border="1" style="margin:auto"><caption>日常消費賬單</caption><thead><!-- 表格頭部 --><tr><th align="left" scope=co1>消費項目</th><th align="right" scope=co1>一月</th><th align="right" scope=co1>二月</th></tr></thead><tbody><!-- 表格主體 --><tr><th align="left" scope="row">食品煙酒</th><td align="right">¥1241.00</td><td align="right">¥1250.00</td></tr><tr><th align="left" scope="row">衣物</th><td align="right">¥330.00</td><td align="right">¥594.00</td></tr><tr><th align="left" scope="row">居住</th><td align="right">¥2100</td><td align="right">¥2100</td></tr><tr><th align="left" scope="row">生活用品及服務</th><td align="right">¥700.00</td><td align="right">¥650.00</td></tr><tr><th align="left" scope="row">醫療保健</th><td align="right">¥150.00</td><td align="right">¥50.00</td></tr><tr><th align="left" scope="row">教育、文化和娛樂</th><td align="right">¥1030.00</td><td align="right">¥1250.00</td></tr><tr><th align="left" scope="row">交通和通信</th><td align="right">¥230.00</td><td align="right">¥650.00</td></tr><tr><th align="left" scope="row">其他用品和服務</th><td align="right">¥130.40</td><td align="right">¥150.00</td></tr></tbody><tfoot><!-- 表格尾部 --><tr><th align="left" scope="row">總計</th><th align="right">¥5911</th><th align="right">¥6694</th></tr></tfoot></table> </body><!--------- End--------></html>實訓三:HTML——基本標簽
第一關創建第一個 HTML 標簽
本關任務:創建你的第一個標簽<h1></h1>,文本內容為welcome to Educoder。
實現的效果如下:
<h1>welcome</h1>
上面這行代碼它表示一個HTML元素。
大多數 HTML 元素都是由開始標簽和結束標簽組成的,通常成對出現 。
開始標簽:用尖括號<>包裹關鍵詞,像<h1>這樣。 結束標簽:用</>包裹和開始標簽一樣的關鍵詞,像</h1>這樣。
可以發現: 結束標簽就比開始標簽多了一個斜杠/。
第一關答案?
<!DOCTYPE html> <html> <head><meta charset="UTF-8"> </head> <body><h1>welcome to Educoder</h1><!-- ********* Begin ********* --><!-- ********* End ********* --> </body> </html>第二關:創建 <h2>-<h6> 標簽
本關任務:依次創建<h2>-<h6>標簽,文本內容為創建不同字體大小的標題,查看它們的區別。
實現的效果如下:
第一關已經創建了h1標簽,它是干什么的呢? 它一般用來創建標題。
另外,<h2>也用來創建標題,它們有什么區別呢? h1的字體比h2的字體要大。
當然, h3,h4,h5,h6也用來創建標題,它們的字體依次減小。
注意:創建標題只有 <h1> - <h6>,沒有 h7,h8的。
第二關答案?
<!DOCTYPE html> <html> <head><meta charset="UTF-8"> </head> <body><h1>創建不同字體大小的標題</h1><!-- ********* Begin ********* --><h2>創建不同字體大小的標題</h2><h3>創建不同字體大小的標題</h3><h4>創建不同字體大小的標題</h4><h5>創建不同字體大小的標題</h5><h6>創建不同字體大小的標題</h6><!-- ********* End ********* --> </body> </html>第三關創建 p 標簽
本關任務:創建一個p標簽,文本內容為我是一個段落。
實現的效果如下:
p元素通常用來表示一個段落。
你可以這樣創建一個p標簽,<p> p標簽表示一個段落。</p>
第三關答案?
<!DOCTYPE html> <html> <head><meta charset="UTF-8"> </head> <body><!-- ********* Begin ********* --><p>我是一個段落</p><!-- ********* End ********* --> </body> </html>第四關創建 a 標簽
本關任務:創建一個a標簽, 跳轉的地址是https://www.educoder.net,文本內容是Educoder平臺。
a標簽通常用來定義一個鏈接。href屬性的值就是鏈接的地址。
你可以這樣創建一個a標簽,<a href="http://www.baidu.com">百度</a>。當你點擊這個鏈接時,它就會跳轉到百度首頁。
第四關答案?
<!DOCTYPE html> <html> <head><meta charset="UTF-8"> </head> <body><!-- ********* Begin ********* --><a href="https://www.educoder.net">Educoder平臺</a><!-- ********* End ********* --> </body> </html>第五關創建 img 標簽
本關任務:創建一個img標簽, 圖片的地址是https://www.educoder.net/attachments/download/207801,提示文字是小狗走路。
效果如下:?
img標簽通常用來表示一個圖片。src屬性的值就是圖片的地址,alt屬性的值是當圖片沒有展現出來時提示的文字 。
你可以這樣創建一個img標簽, <img src="https://www.educoder.net/attachments/download/207791" alt="風景畫"/>。
這樣圖片就顯示出來了。
第五關答案?
<!DOCTYPE html> <html> <head><meta charset="UTF-8"> </head> <body><!-- ********* Begin ********* --><img src="https://www.educoder.net/attachments/download/207801" alt="小狗走路"/><!-- ********* End ********* --></body> </html>第六關創建 div 標簽
本關任務:創建一個div標簽, 文本內容是我是div標簽。
效果如下:
div標簽可以把文檔分割為獨立的、不同的部分。它沒有實際的意義,僅僅表示創建了一個塊級元素。
你可以這樣創建一個div標簽,<div>創建div標簽</div>。
可以發現:它和 <h1>-<h6>,<p>標簽的創建是一樣的,只不過它沒有實際的意義。
第六關答案?
<!DOCTYPE html> <html> <head><meta charset="UTF-8"> </head> <body><h2>我是h2標簽</h2><p>我是p標簽</p><!-- ********* Begin ********* --><div>我是div標簽</div><!-- ********* End ********* --> </body> </html>第七關添加注釋
本關任務:注釋掉 div 標簽,同時在p標簽上方添加注釋說明。
什么是注釋? 為什么要添加注釋呢?
注釋是解釋性文本,在運行程序時,會被程序跳過,不做處理。
注釋有兩個作用:
- 可以給代碼添加文字說明,便于代碼閱讀和日后維護;
- 對于暫時不用但又不能刪除的代碼,可以添加注釋保存下來;
如何添加注釋呢?
<!--表示注釋的開始, -->表示注釋的結束,這樣就可以添加提示說明和注釋元素了。
你可以這樣注釋p標簽和添加文字說明。
第七關答案?
<!DOCTYPE html> <html> <head><meta charset="UTF-8"> </head> <body><h2></h2><!-- ********* Begin ********* --><!--<div></div>--><!--一帶一路-->注:該代碼為<p> 之前的代碼實訓四:HTTP基礎
HTTP 協議是 Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用于從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,減少網絡傳輸。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪部分,以及哪部分內容優先顯示等。python 爬蟲開發,主要就是和 HTTP 協議打交道。 本實訓主要介紹了網絡爬蟲的基礎知識,包括 HTTP 的狀態碼、HTTP 消息頭、HTTP 請求方式和 HTTP 工作原理等 HTTP 相關知識以及谷歌(Chrome)瀏覽器的開發者工具簡介。
第一關HTTP 標準
本關任務:掌握 HTTP 的相關知識,完成相關選擇題。
HTTP 是一個客戶端終端和服務器端請求和應答的標準。通過使用網頁瀏覽器、網絡爬蟲或者其它的工具,客戶端發起一個 HTTP 請求到服務器上指定端口(默認端口為80)。我們稱這個客戶端為用戶代理程序(user agent)。應答的服務器上存儲著一些資源,比如 HTML 文件和圖像。我們稱這個應答服務器為源服務器(origin server)。在用戶代理和源服務器中間可能存在多個“中間層”,比如代理服務器、網關或者隧道(tunnel)。 盡管 TCP/IP 協議是互聯網上最流行的應用,HTTP 協議中,并沒有規定必須使用它或它支持的層。事實上,HTTP 可以在任何互聯網協議上,或其他網絡上實現。HTTP 假定其下層協議提供可靠的傳輸。因此,任何能夠提供這種保證的協議都可以被其使用。因此也就是其在 TCP/IP 協議族使用 TCP 作為其傳輸層。?
第一關答案?
答案:1.B? ?2.B? 3.D
第二關開發者工具的基本使用
本關任務:了解開發者工具對于爬蟲的用途。
開發者工具是一套內置于瀏覽器中的 Web 開發和調試工具,可用來對網站進行迭代、調試和分析。 對于爬蟲實戰來說,可以通過開發者工具快捷的定位元素,獲取中途請求文件和查看網頁結構等極其強大與便捷的用途。??
第二關答案
答案:1.C? ?2.B
實訓五:Python——JSON基礎?
在現實世界中,人與人之間的交流,需要建立在某種大家都能聽懂的語言基礎上。而在計算機領域中,各個系統之間的交流通信,也需要建立在某種公共的格式上。 本次實訓將介紹:JSON 數據格式,學習使用 Python 對它們進行解析的方法,以此拓展我們的知識面,讓我們能寫出更加實用的 Python 程序。
第一關JSON篇:JSON基礎知識
本關任務:手動編寫一個 JSON 格式的數據文件。
JSON 全稱:JavaScript Object Notation(JavaScript 對象表示法),是一種輕量級的文本數據交換格式。與接下來要介紹的 XML 相比,擁有更小、更快、更易解析的特點。?
第一關答案?
{"count":3 , "students":[{"name":"趙昊" , "age":15 , "ismale" :true },{"name":"龍傲天" , "age":16 , "ismale" :true},{"name":"瑪麗蘇" , "age":15 , "ismale" : false}] }第二關JSON篇:使用json庫
本關任務:編寫一個能讀取并修改 JSON 數據的程序。
json庫是 Python 內置的一個用于操作 JSON 數據的庫,提供了幾個函數用于解析與生成(或者說反序列化與序列化)JSON 格式的數據。?
詳情見此篇博文:
Python--JSON基礎_宇阷的博客-CSDN博客
實訓六:Python——XPath基礎?
第一關:XPath 路徑表達式
任務描述
本關任務:根據給定的 xml 文檔,使用 XPath 表達式選取指定內容。
相關知識
為了完成本關任務,你需要了解 XPath 路徑表達式的基本語法,理解節點的基本類型,完成節點的獲取、屬性的匹配獲取、多屬性的匹配獲取、文本的獲取、按序選擇等。
節點的基本類型
XPath 是一門在 XML 文檔中查找信息的語言,雖然是被設計用來搜尋 XML 文檔的,但是它也能應用于 HTML 文檔,并且大部分瀏覽器也支持通過 XPath 來查詢節點。在 Python 爬蟲開發中,經常使用 XPath 查找提取網頁中的信息,因此 XPath 非常重要。
在 XPath 中, XML 文檔是被作為節點樹來對待的,有七種類型的節點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節點。樹的根被稱為文檔節點或者根節點。
根節點(Root Node)
? ? ? ?根節點是一棵樹的最頂層,根節點是唯一的。樹上其它所有元素節點都是它的子節點或后代節點。對根節點的處理機制與其它節點相同。對樹的匹配總是先從根節點開始。文檔中的<bookstore>即為根節點。
元素節點(Element Nodes)
元素節點相對應的是文檔中每個元素,一個元素節點的子節點可以為元素節點、注釋節點、處理指令節點和文本節點。元素節點可以定義一個唯一的標識(id)。元素節點可以有拓展名,由兩部分組成:命名空間 URL 和本地命名。文檔中的<book>即為元素節點。
文本節點(Text Nodes)
文本節點包含一組字符數據,任何一個文本節點都沒有相鄰的兄弟文本節點,而且文本節點沒有擴展名。文檔中的Learning XML即為文本節點。
屬性節點(Attribute Nodes)
每個元素節點有一個相關聯的屬性節點集合,元素是每個屬性節點的父節點,但屬性節點卻不是其父元素的子節點。這就是說,通過查找元素的子節點可以匹配出元素的屬性節點,但反過來不成立,只是單向的。再有,元素的屬性節點沒有共享性,也就是說不同的元素節點不共有同一個屬性節點。文檔中的lang="eng"即為屬性節點。
命名空間節點(Namespace Nodes)
每個元素節點都有一個相關聯的命名空間節點集。在 XML 文檔中,命名空間是通過保留屬性聲明的。因此,在 XPath 中,該類節點與屬性節點極為相似,它們與父元素之間的關系是單向的,并且不具有共享性。
處理指令節點(Processing Instruction Nodes)
處理指令節點對應于 XML 文檔中的每一條處理指令。它也有擴展名,擴展名的本地命名指向處理對象,而命名空間部分為空。
注釋節點(Comment Nodes)
注釋節點對應于文檔中的注釋。
Xpath路徑表達式的基本語法
XPath 使用路徑表達式來選取 XML 文檔中的節點或節點集。節點是沿著路徑(path)或者步(steps)來選取的。接下來介紹如何選取節點,首先了解一下常用的路徑表達式,來進行節點的選取,如下表所示:
| nodename | 選取此節點的所有子節點 |
| / | 從根節點選取 |
| // | 選擇任意位置的某個節點 |
| . | 選取當前節點 |
| .. | 選取當前節點的父節點 |
| @ | 選取屬性 |
根據路徑表達式的規則,我們對上文的的 XML 文檔進行節點選取,如下表所示。
| bookstore | 選取 bookstore 元素的所有子節點 |
| /bookstore | 選取根元素 bookstore |
| /bookstore/book/text() | 選取屬于 bookstore 子元素的 book 元素下的所有文本內容 |
| //book | 選取所有 book 子元素,而不管它們在文檔中位置 |
| //@eng | 選取名為 eng 的所有屬性 |
謂語的用法如下表所示:
| /bookstore/book[1] | 選取屬于 bookstore 子元素的第一個 book 元素 |
| /bookstore/book[last()] | 選取屬于 bookstore 子元素的最后一個 book 元素 |
| /bookstore/book[last()-1] | 選取屬于 bookstore 子元素的倒數第二個 book 元素 |
| /bookstore/book[position()<3] | 選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素 |
| //title[@lang] | 選取所有擁有名為 lang 的屬性的 title 元素 |
| //title[@lang='eng'] | 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性 |
| //title[@lang='eng' and @class="good"]? | 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性和值為good的class屬性 |
| /bookstore/book[price>35.00] | 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大于 35.00 |
| /bookstore/book[price>35.00]/title | 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大于 35.00 |
XPath 在進行節點選取的時候可以使用通配符*匹配未知的元素,同時使用操作符|一次選取多條路徑,使用示例如下表所示:
| /bookstore/* | 選取 bookstore 元素的所有子元素 |
| //* | 選取文檔中的所有元素 |
| //title[@*] | 選取所有帶有屬性的 title 元素 |
| //book/title 丨 //book/price | 選取 book 元素的所有 title 和 price 元素 |
| //title 丨 //price | 選取文檔中的所有 title 和 price 元素 |
| /bookstore/book/title 丨 //price | 選取屬于 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素 |
第一關答案
1.選取bookstore元素的所有子節點 ********** Begin ********* bookstore *********** End **********2.選取所有擁有名為 lang 的屬性的 title 元素 ********** Begin ********* //title[@lang] *********** End **********3.選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性和值為good的class屬性 ********** Begin ********* //title[@lang='eng' and @class="good"] *********** End **********4.選取屬于 bookstore 子元素的book元素下的所有文本內容 ********** Begin ********* /bookstore/book/text() *********** End **********5.選取屬于 bookstore 子元素的第一個 book 元素 ********** Begin ********* /bookstore/book[1]*********** End **********第二關:XPath 軸定位
任務描述
本關任務:根據給定的 xml 文檔,使用 XPath 表達式選取指定內容。
相關知識
為了完成本關任務,你需要了解:XPath 中如何使用軸定位。
軸
在爬蟲里面經常要用到定位,XPath 定位有著舉足輕重的地位,因為它功能很強大。結合它里面的文本定位、模糊定位、邏輯定位等,基本能搞定所有的元素定位問題。
軸定義了所選節點與當前節點之間的樹關系。在 Python 爬蟲開發中,提取網頁中的信息時,會遇到這種情況:首先提取到一個節點的信息,然后想在在這個節點的基礎上提取它的子節點或者父節點,這時候就會用到軸的概念。軸的存在會使提取變得更加靈活和準確。
在上一關,我們了解了位置路徑表達式中的相對位置路徑、絕對位置路徑和步的概念。位置路徑可以是絕對的,也可以是相對的。絕對路徑起始于正斜杠/,而相對路徑不會這樣。在兩種情況中,位置路徑均包括一個或多個步,每個步均被斜杠分割: /step/step/..(絕對位置路徑),step/step/.. (相對位置路徑)。
步(step)包括:軸(axis)、節點測試( node-test)、零個或者更多謂語( predicate),用來更深入地提煉所選的節點集。XPath 中的軸名及含義如下表所示:
| ancestor | 選取當前節點的所有先輩(父或祖父等) |
| ancestor-or-self | 選取當前節點的所有先輩(父或祖父等)以及當前節點本身 |
| attribute | 選取當前節點的所有屬性 |
| child | 選取當前節點的所有子元素 |
| descendant | 選取當前節點的所有后代元素(子或孫等) |
| descendant-or-self | 選取當前節點的所有后代元素(子或孫等)以及當前節點本身 |
| following | 選取文檔中當前節點的結束標簽之后的所有節點 |
| namespace | 選取當前節點的所有命名空間節點 |
| parent | 選取當前節點的父節點 |
| preceding | 選取文檔中當前節點的開始標簽之前的所有節點 |
| preceding-sibling | 選取當前節點之前的所有同級節點 |
| self | 選取當前節點 |
軸的使用
軸需要通過步的語法,來實現節點的選取。步的語法為:軸名稱::節點測試[謂語],大家可能覺比較抽象。下面通過案例演示來幫助理解,XML 文檔示例如下所示:
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book><title lang="eng" class="good">Harry Potter</title><price>29.99</price> </book> <book><title lang="eng">Learning XML</title><price>39.95</price> </book> </bookstore>第二關答案
1.選取所有屬于當前節點的子元素的 book 節點 ********** Begin ********* child::book *********** End **********2.選取當前節點的 lang 屬性 ********** Begin ********* attribute::lang *********** End **********3.選取當前節點的所有 price 孫節點 ********** Begin ********* child::*/child::price *********** End **********第三關:XPath 解析
任務描述
本關任務:編寫解析 HTML 文件的 Python 程序。
相關知識
為了完成本關任務,你需要掌握:Python 環境下使用 XPath 對 HTML 文件進行解析。
lxml的安裝
lxml 是 一個 HTML/XML 的解析器,主要的功能是解析和提取 HTML/XML 數據。lxml 和正則一樣,也是用 C 實現的,是一款高性能的 Python HTML/XML 解析器,我們可以利用之前學習的 XPath 語法,來快速地定位特定元素以及節點信息。
如果本地 Python 環境沒有安裝 lxml,可以在命令提示符窗口輸入命令pip install lxml,安裝 lxml 模塊,如下圖所示。
lxml的使用
使用 lxml,需要先導入相關包,語法如下:
現在有如下 HTML 代碼,需要獲取第一個 book 節點下的 title 節點中的 class 的屬性值:
使用 xpath 表達式解析網頁之前,需要獲取元素樹對象,這里有兩種方法:
- 如果上述代碼為本地文件,并且文件名為test.html,獲取元素樹對象的代碼如下所示:
- parse = etree.HTMLParser(encoding='utf-8') # 添加編碼
- tree = etree.parse('test.html', parse) # 指定本地HTML文件讀取
- 如果上述代碼為字符串類型變量,并且變量名為html,獲取元素樹對象的代碼如下所示:
- parse = etree.HTMLParser(encoding='utf-8') # 添加編碼
- tree = etree.HTML(html, parse) # html為python字符串
獲取元素樹對象后,就可以使用 XPath 表達式解析網頁了,代碼如下所示:
完成上述指定任務有多種實現方式,以下演示了四種不同的 XPath 表達式,都能夠獲取第一個 book 節點下的 title 節點中的 class 的屬性值。
以上代碼都可以獲取圖中紅框部分的內容。
第三關答案
# 導入lxml庫 from lxml import etree # 讀取lll.html文件并轉化為元素樹對象 parse = etree.HTMLParser(encoding='utf-8') tree = etree.parse('src/step3/lll.html', parse) # 補充xpath表達式,獲取所有書的名稱 # ********** Begin ********* # print(tree.xpath('//bookstore/book/title/text()')) # *********** End ********** # # 補充xpath表達式,獲取所有書的價格 # ********** Begin ********* # print(tree.xpath('//bookstore/book/price/text()')) # *********** End ********** # # 填寫代碼, 獲取價格低于30的書名 # ********** Begin ********* # print(tree.xpath('//bookstore/book[price < 30.00]/title/text()')[0]) # *********** End ********** #在學習中成功、在學習中進步!我們一起學習不放棄~
記得三連哦~?你們的支持是我最大的動力!!歡迎大家閱讀往期文章哈~
小編聯系方式如下,歡迎各位巨佬溝通交流,代碼什么的加小編私聊哦~
總結
以上是生活随笔為你收集整理的两万字详细爬虫知识储备,数据采集与清洗基础习题(一)头歌参考答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 灰色关联与TOPSIS法 —— matl
- 下一篇: php post 丢失,php post