網絡爬蟲中Xpath的使用方法

正則表達式雖然可以處理包含了諸如 HTML 或 XML 內容的字符串,但只能根據文本的
特征匹配字符串,而忽略字符串所包含的內容的真實格式。為了解決這個問題,Python 引入
XPath 以及支持 XPath 的第三方庫 lxml,專門對 XML 或 HTML 格式的數據進行解析。接下來,
本節將針對 XPath 和 lxml 的相關內容進行詳細介紹。

一、XPath 簡介

XPath 即 XML 路徑查詢語言(XML Path Language),是一種用于確定 XML 文檔中部分
節點位置的語言。它起初只支持搜索 XML 文檔,更新后能支持搜索 HTML 文檔。截至完稿
時,XPath 的最新版本為 XPath3.1。
那么 XPath 是如何搜索 XML 或 HTML 文檔呢?其實 XPath 基于 XML 或 HTML 的節點
樹,沿著節點樹的節點關系定位到目標節點所在的位置,并選取節點或節點集。為了形象地
描述出搜索節點的路徑,XPath 提供了簡潔明了的路徑表達式,通過路徑表達式可以快速地定
位與選取 XML 或 HTML 文檔中的一個節點或者一組節點集。
與正則表達式相比,路徑表達式的搜索方式大不相同。在這里,我們借用一個形象的例
子進行比較。假如我們把選取目標節點比作找金燕龍辦公樓。如果我們通過正則表達式查找,
則正則表達式會告訴我們辦公樓有哪些特征,辦公樓的左邊有哪些建筑、右邊有哪些建筑。
這樣的描述限定的查找范圍比較寬泛,查找起來比較煩瑣。如果我們通過路徑表達式查找,
則路徑表達式會直接告訴我們辦公樓的具體位置,即中國北京市昌平區建材城西路金燕龍辦
公樓。這樣的描述更加精準、更易查找。
路徑表達式描述了從一個節點到另一個節點或一組節點的路徑。這些路徑與在常規的計算
機文件系統中見到的路徑非常相似。例如,“/學生名單/班級/學生/籍貫”就是一個路徑表達式,
該路徑表達式也是用“/”字符進行分隔的,只不過它分隔的是節點,而不是目錄。接下來,通
過一張示意圖來描述 XML 文檔、XML 節點樹與路徑表達式的關系,具體如圖 4-1 所示。
422ec9dbdf0e41b0bf9788283e37e4ec.png
在圖 4-1 中,從左到右、從上到下依次為 XML 文檔、XML 節點樹和路徑表達式。其中,
路徑表達式為“/bookstore/book/price”,它對應的路徑為 XML 節點樹中加粗的線條,用于選
取節點<price>對應的文本 39.95。

二、XPath 語法

我們如果要編寫一個路徑表達式,則要先了解 XPath 的語法,如此才能使用路徑表達式
正確地選取節點。路徑表達式會從某個節點開始沿著節點樹查找節點,直至找到目標節點。
由于節點的多樣性,為了幫助開發人員快速選取目標節點,XPath 提供了一套語法規則。下面
從選取節點、謂語、選取未知節點、選取若干路徑這 4 個方面介紹 XPath 的語法。

1.選取節點

選取節點是最基礎的操作之一。節點所在的路徑既可以從根節點開始,也可以從任意位
置開始。選取節點的表達式如表 4-3 所示。
478967fe596b433ca6d97d3b1cf50ba2.png

1bff45a1ca6d40bbb1c6b67530b71198.png

接下來,以 XML 文檔 bookstore.xml 為例,為大家演示如何使用表 4-3 中的表達式選取
XML 文檔中的節點。bookstore.xml 的具體內容如下。
<?xml version="1.0" encoding="ISO-8859-1"?> 
<bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> 
</bookstore>

????????選取節點的示例代碼如下。

 1 bookstore # 選取 bookstore 的所有子節點2 /bookstore # 選取根節點 bookstore 3 bookstore/book # 從根節點 bookstore 開始,向下選取名為 book 的所有子節點4 //book # 從任意節點開始,選取名為 book 的所有子節點5 bookstore//book # 從 bookstore 的后代節點中,選取名為 book 的所有子節點6 //@lang # 選取所有名為 lang 的屬性節點
在上述代碼中,第 3 行、第 4 行的路徑表達式具有相同的功能,都可以選取節點 book 的所
有子節點。前者是從根節點開始沿著路徑向下選取的,后者是從節點樹的任意位置開始選取的。

2.謂語

謂語是為路徑表達式附加的條件,主要用于篩選當前被處理的節點集,選取出滿足某個
特定條件的節點,或者包含了指定屬性或值的節點。謂語會嵌入方括號中,位于要補充說明
的節點后面。帶謂語的路徑表達式的語法格式如下:
節點[謂語]
在上述格式中,方括號中的謂語可以是整數、屬性、函數,也可以是整數、屬性、函數
與運算符組合的表達式。如果謂語是整數(從 1 開始),則這個數值將作為位置,用于從節點
集中選取與該位置對應的節點;如果是屬性,則會從節點集中選取包含該屬性的節點;如果
是函數,則會將該函數的返回值作為條件,從節點集中選取滿足條件的節點。常用的 XPath
函數如表 4-4 所示。
e74661f6bf7e441195b30240688b518e.png

8f36aad2166e42e2b81d75efe0303246.png

接下來,以前面的 bookstore.xml 為例,為大家演示帶謂語的路徑表達式的用法,具體代
碼如下。
/bookstore/book[1] # 選取屬于 bookstore 子節點的第 1 個 book 節點
/bookstore/book[last()] # 選取屬于 bookstore 子節點的最后一個 book 節點
/bookstore/book[last()-1] # 選取屬于 bookstore 子節點的倒數第 2 個 book 節點
/bookstore/book[position()<3] # 選取屬于 bookstore 子節點的前兩個 book 節點
//title[@lang] # 選取所有的屬性名稱為 lang 的 title 節點
//title[@lang= 'eng'] # 選取所有的屬性名稱為 lang 且屬性值為 eng 的 title 節點
# 選取子節點 price 的值大于 35.00,且父節點為 bookstore 的所有 book 節點
/bookstore/book[price>35.00] 
# 選取屬于 book 的所有子節點 title,且節點 book 的子節點 price 的值必須大于 35.00 
/bookstore/book[price>35.00]/title

3.選取未知節點

表 4-5 選取未知節點的通配符和函數
通配符/函數說明
*
匹配任何元素節點
@*
匹配任何屬性節點
node()
匹配任何類型的節點

????????XPath 提供了選取未知節點的通配符和函數,關于它們的說明如表 4-5 所示。

????????以前面的 XML 文檔為例,演示表 4-5 中通配符和函數的用法,具體代碼如下。

/bookstore/* # 選取屬于 bookstore 的所有子節點
//* # 選取文檔中的所有節點
//title[@*] # 選取所有帶有屬性的節點 title

4.選取若干路徑

在 XPath 中,我們可以使用“|”運算符連接多個路徑表達式,根據多個路徑選取對應的
節點。以前面的 XML 文檔為例,演示“|”運算符的用法,具體代碼如下。
//book/title | //book/price # 選取屬于 book 的子節點 title 和 price 
//title | //price # 選取所有 title 節點和 price 節點
# 選取屬于/bookstore/book/的所有 title 節點和文檔中的所有 price 節點
/bookstore/book/title | //price

?

?

?

?

?

?

?

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35118.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git 合并master到分支

master分支的代碼領先自己的分支,git 如何把master分支代碼合并到自己的分支 1.首先切換到主分支 git checkout master 2.使用git pull 把領先的主分支代碼pull下來 git pull 3.切換到自己的分支 git checkout xxx(自己的分支) 4.把主分支的代碼merge到自己的分支 git merge ma…

minio+tusd+uppy搭建文件上傳服務

1、docker部署minio、tusd服務 1.1 新建docker-compose.yml minio API: http://ip:9100 minio控制臺: http://ip:9101 tus API: http://ip:9102/files/ tus webhooh: http:172.0.0.1:3000/files/webhooh(用戶鑒權API) version: 3.7services:minio:image: minio/minio:RELEAS…

亞馬遜運營專詞(一)

許多新入駐亞馬遜的大陸賣家&#xff0c;對亞馬遜的專業詞匯還不太了解&#xff0c;導致在運營店鋪的過程出現一些問題&#xff0c;今天就來講解一下亞馬遜常用的運營專詞&#xff0c;方便新手賣家深入了解。 1. Listing&#xff1a;亞馬遜listing指的是產品的詳情頁面&#xf…

通過BLE實現類似UART的串行通信:NUS服務 vs GATT服務

在物聯網和智能設備的發展中&#xff0c;藍牙低功耗&#xff08;Bluetooth Low Energy, BLE&#xff09;技術已經成為無線數據傳輸的重要手段。本文將介紹通過BLE實現類似UART的串行通信&#xff0c;并對比NUS服務和GATT服務的使用場景&#xff0c;幫助開發者更好地選擇適合的技…

2024越南醫藥、制藥機械展

2024年越南國際醫藥&#xff0c;制藥裝備及技術展覽會 時間&#xff1a; 2024年11月21--23日 地點&#xff1a;越南胡志明市-西貢會展中心SECC 2024年越南國際醫藥&#xff0c;制藥裝備及技術展覽會將于2024年11月21-23日在越南胡志明市盛大舉行&#xff01;展覽會以國際化、專…

【Feature Pyramid Networks for Object Detection】

Feature Pyramid Networks for Object Detection 摘要引言2 相關工作3 FPN4 應用摘要 特征金字塔是識別系統中用于檢測不同尺度對象的基本組件。但是,最近的深度學習對象檢測器已經避免了金字塔表示,部分原因是它們在計算和內存方面都很密集。在這篇論文中,我們利用深度卷積…

LeetCode經典題之876、143 題解及延伸

系列目錄 88.合并兩個有序數組 52.螺旋數組 567.字符串的排列 643.子數組最大平均數 150.逆波蘭表達式 61.旋轉鏈表 160.相交鏈表 83.刪除排序鏈表中的重復元素 389.找不同 1491.去掉最低工資和最高工資后的工資平均值 896.單調序列 206.反轉鏈表 92.反轉鏈表II 141.環形鏈表 …

paddleocr查看標注好的數據錯誤信息

字符計數 import os import json from collections import Counter# 按字符計數 label_dir"/Users/thy/Downloads/chinese20240613" zi_ls[] with open(os.path.join(label_dir,"Label.txt")) as f:linesf.readlines()for line in lines:line line.strip…

Java面試題:聚簇索引和非聚簇索引

聚簇索引和非聚簇索引 聚簇索引(聚集索引) 將數據的存儲和索引放在一塊,索引結構的葉子節點保存了行數據 索引字段必須存在,且只能存在一個 非聚集索引(二級索引) 將數據和索引分開存儲,索引結構的葉子節點關聯的是對應的主鍵 索引字段可以存在多個 索引的選取規則 如果…

【學習】常用的分類網絡

1. LeNet 提出時間&#xff1a;1998年最新版本&#xff1a;原始版本使用的數據集格式&#xff1a;MNIST&#xff08;28x28灰度圖像&#xff09;優點&#xff1a; 結構簡單&#xff0c;易于理解和實現。對于小規模圖像數據集&#xff08;如MNIST&#xff09;有很好的表現。缺點…

豆瓣高分項目管理書籍推薦

&#x1f4ec;豆瓣網站上有很多項目管理領域的書籍獲得了較高的評分&#xff0c;以下是一些高分項目管理書籍的精選列表&#xff0c;發出來跟大家分享一下&#xff1a; 《項目管理知識體系指南&#xff08;PMBOK指南&#xff09;》 【內容簡介】這本書是美國項目管理協會&…

opencv檢測圖片上七種顏色,分辨顏色和對應位置

opencv檢測圖片上七種顏色&#xff0c;分辨顏色和對應位置 讀取圖片&#xff1a;使用cv2.imread()函數讀取目標圖片。 轉換顏色空間&#xff1a;通常在HSV顏色空間中進行顏色檢測&#xff0c;因為HSV顏色空間更適合描述顏色的屬性。 定義顏色范圍&#xff1a;為七種顏色定義…

RabbitMQ 修改默認密碼

RabbitMQ的一些常用命令 #啟動rabbitmq service rabbitmq-server start# 查看rabbitMQ的運行狀態 service rabbitmq-server status# 開啟rabbitMQ的后臺管理插件 rabbitmq-plugins enable rabbitmq_management # 重啟RabbitMQ服務 service rabbitmq-server restart RabbitMQ的…

AcWing 797:差分 ← 一維差分模板題

【題目來源】https://www.acwing.com/problem/content/799/【題目描述】 輸入一個長度為 n 的整數序列。 接下來輸入 m 個操作&#xff0c;每個操作包含三個整數 l,r,c&#xff0c;表示將序列中 [l,r] 之間的每個數加上 c。 請你輸出進行完所有操作后的序列。【輸入格式】 第一…

富格林:正規操作實現穩健出金

富格林認為&#xff0c;當下的金融市場&#xff0c;投資者進行理財都會特別關注盈利效率高的產品&#xff0c;而近年來興起的現貨黃金&#xff0c;其高效的盈利效率吸引著大批朋友關注。不過&#xff0c;要想在這盈利出金&#xff0c;就得學習掌握正規的交易策略。下面富格林將…

onnx模型修改:去掉Dropout層

文章目錄 嘗試1&#xff1a;強行設置dropout層train mode為False嘗試2&#xff1a;找到onnx模型中的dropout, train mode設置為False嘗試3&#xff1a;直接刪除dropout層&#xff0c;連接其輸入輸出結語 最近訓練模型使用了tinyvit&#xff0c;性能挺強的&#xff1a; 但是導出…

超細毛搭配超寬設計,一款更呵護牙齦的牙刷

牙齦敏感的時候&#xff0c;刷牙特別難受&#xff0c;最近試了試惠百施&#xff08;EBISU&#xff09;65孔寬頭軟毛牙刷&#xff0c;感覺它的口腔護理體驗很不錯。這款牙刷的設計獨特&#xff0c;采用寬頭設計&#xff0c;一次就能刷兩排牙齒&#xff0c;極大地提高了清潔效率。…

RS232自由轉Profinet協議網關模塊連接1200PLC與掃碼槍通訊及手動清零案例

一、RS232和Profinet這兩種通訊接口的特點和應用場景&#xff1a; RS232是一種串行通訊接口標準&#xff0c;常用于連接計算機和外部設備&#xff0c;傳輸速率較低但穩定可靠。Profinet則是一種工業以太網通訊協議&#xff0c;具有高速、實時性強的特點&#xff0c;適用于工業…

C/C++語言通過動態鏈表實現按需內存分配和使用(Linux Ubuntu 24.04環境)

我認為比較理想的內存使用方式應該實現這幾個特性&#xff1a; 1. 分配一塊能滿足大多數情況下需求的內存&#xff0c;比如80%的情況下都不需要再次分配內存。 2. 對另外20%需要較多內存的情況&#xff0c;可以通過動態鏈表按需追加新的內存塊。 3. 要對總共消耗的內存有一個…

【C語言】解決C語言報錯:Dangling Pointer

文章目錄 簡介什么是Dangling PointerDangling Pointer的常見原因如何檢測和調試Dangling Pointer解決Dangling Pointer的最佳實踐詳細實例解析示例1&#xff1a;釋放內存后未將指針置為NULL示例2&#xff1a;返回指向局部變量的指針示例3&#xff1a;指針懸空后繼續使用示例4&…