lxml模組和xpath語法
1. 瞭解 lxml模組和xpath語法
> 對html或xml形式的文字提取特定的內容,就需要我們掌握lxml模組的使用和xpath語法。
- - lxml模組可以利用XPath規則語法,來快速的定位HTML\XML 文件中特定元素以及獲取節點資訊(文字內容、屬性值)
- - XPath (XML Path Language) 是一門在 HTML\XML 文件中查詢資訊的**語言**,可用來在 HTML\XML 文件中對**元素和屬性進行遍歷**。
- - W3School官方文件:<http://www.w3school.com.cn/xpath/index.asp>
- - 提取xml、html中的資料需要lxml模組和xpath語法配合使用
2. 谷歌瀏覽器xpath helper外掛的安裝和使用
3. xpath的節點關係
> 學習xpath語法需要先了解xpath中的節點關係
3.1 xpath中的節點是什麼
> 每個html、xml的標籤我們都稱之為節點,其中最頂層的節點稱為根節點。我們以xml為例,html也是一樣的
3.2 xpath中節點的關係
**`author`是`title`的第一個兄弟節點**
4. xpath語法-基礎節點選擇語法
> 1. XPath 使用路徑表示式來選取 XML 文件中的節點或者節點集。
> 2. 這些路徑表示式和我們在常規的**電腦檔案系統中看到的表示式**非常相似。
> 3. **使用chrome外掛選擇標籤時候,選中時,選中的標籤會新增屬性class="xh-highlight"**
4.1 xpath定位節點以及提取屬性或文字內容的語法
表示式 | 描述 | 示例 | 結果 |
nodename | 選取此節點的所有子節點 |
bookstore |
選取bookstore下所有的子節 |
/ | 如果是在最前面,代表從根 |
|
|
// | 從全域性節點中選擇節點,隨便在哪個位置 |
|
從全域性節點中找到所有的book節點 |
@ |
|
|
選擇所有book節點的price屬性 |
4.2 語法練習
> 接下來我們通過itcast的頁面來練習上述語法:http://www.itcast.cn/
- - 選擇所有的h2下的文字
- - `//h2/text()`
- - 獲取所有的a標籤的href
- - `//a/@href`
- - 獲取html下的head下的title的文字
- - `/html/head/title/text()`
- - 獲取html下的head下的link標籤的href
- - `/html/head/link/@href`
5. xpath語法-節點修飾語法
> 可以根據標籤的屬性值、下標等來獲取特定的節點
5.1 節點修飾語法
路徑表示式 | 結果 |
//title[@lang="eng"] | 選擇lang屬性值為eng的所有title元素 |
/bookstore/book[1] | 選取屬於 bookstore 子元素的第一個 book 元素。 |
/bookstore/book[last()] | 選取屬於 bookstore 子元素的最後一個 book 元素。 |
/bookstore/book[last()-1] | 選取屬於 bookstore 子元素的倒數第二個 book 元素。 |
/bookstore/book[position()>1 | 選擇bookstore下面的book元素,從第二個開始選擇 |
//book/title[text()='Harry Potter'] | 選擇所有book下的title元素,僅僅選擇文字為Harry Potter的title元素 |
/bookstore/book[price>35.00]/title | 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00。 |
5.2 關於xpath的下標
- 在xpath中,第一個元素的位置是1
- 最後一個元素的位置是last()
- 倒數第二個是last()-1
5.3 語法練習
> 從itcast的頁面中,選擇所有學科的名稱、第一個學科的連結、最後一個學科的連結:http://www.itcast.cn/
- - 所有的學科的名稱
- - `//div[@class="nav_txt"]//a[@class="a_gd"]`
- - 第一個學科的連結
- - `//div[@class="nav_txt"]/ul/li[1]/a/@href`
- - 最後一個學科的連結
- - `//div[@class="nav_txt"]/ul/li[last()]/a/@href`
6. xpath語法-其他常用節點選擇語法
> 可以通過**萬用字元**來選取未知的html、xml的元素
6.1 選取未知節點的語法
- * 匹配任何元素節點。
- node() 匹配任何型別的節點。
6.2 語法練習
> 從itcast的頁面中 http://www.itcast.cn/ ,選中全部的標籤、全部的屬性
- - 全部的標籤
- - `//*`
- - 全部的屬性
- - `//node()`
7. lxml模組的安裝與使用示例
> lxml模組是一個第三方模組,安裝之後使用
7.1 lxml模組的安裝
對傳送請求獲取的xml或html形式的響應內容進行提取
pip/pip3 install lxml
7.2 爬蟲對html提取的內容
- 提取標籤中的**文字內容**
- 提取標籤中的**屬性的值**
- 比如,提取a標籤中href屬性的值,獲取url,進而繼續發起請求
7.3 lxml模組的使用
1. 匯入lxml 的 etree 庫
`from lxml import etree`
2. 利用etree.HTML,將html字串(bytes型別或str型別)轉化為Element物件,Element物件具有xpath的方法,返回結果的列表
html = etree.HTML(text) ret_list = html.xpath("xpath語法規則字串")
3. xpath方法返回列表的三種情況
- 返回空列表:根據xpath語法規則字串,沒有定位到任何元素
- 返回由字串構成的列表:xpath字串規則匹配的一定是文字內容或某屬性的值
- 返回由Element物件構成的列表:xpath規則字串匹配的是標籤,列表中的Element物件可以繼續進行xpath
7.4 lxml模組使用示例
> 執行下面的程式碼,檢視列印的結果
from lxml import etree text = ''' <div> <ul> <li class="item-1"> <a href="link1.html">first item</a> </li> <li class="item-1"> <a href="link2.html">second item</a> </li> <li class="item-inactive"> <a href="link3.html">third item</a> </li> <li class="item-1"> <a href="link4.html">fourth item</a> </li> <li class="item-0"> a href="link5.html">fifth item</a> </ul> </div> ''' html = etree.HTML(text) #獲取href的列表和title的列表 href_list = html.xpath("//li[@class='item-1']/a/@href") title_list = html.xpath("//li[@class='item-1']/a/text()") #組裝成字典 for href in href_list: item = {} item["href"] = href item["title"] = title_list[href_list.index(href)] print(item)