【爬蟲入門知識講解:xpath】

3.3、xpath

xpath在Python的爬蟲學習中,起著舉足輕重的地位,對比正則表達式 re兩者可以完成同樣的工作,實現的功能也差不多,但xpath明顯比re具有優勢,在網頁分析上使re退居二線。

xpath 全稱為XML Path Language 一種小型的查詢語言
xpath的優點:

  • 可在XML中查找信息
  • 支持HTML的查找
  • 通過元素和屬性進行導航

python開發使用XPath條件: 由于XPath屬于lxml庫模塊,所以首先要安裝庫lxml。

from lxml import etree
selector=etree.HTML(源碼) #將源碼轉化為能被XPath匹配的格式
selector.xpath(表達式) #返回為一列表

【1】路徑表達式

表達式描述實例解析
/從根節點選取/body/div[1]選取根結點下的body下的第一個div標簽
//從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置//a選取文檔中所有的a標簽
./當前節點再次進行xpath./a選取當前節點下的所有a標簽
@選取屬性//@calss選取所有的class屬性

【2】謂語(Predicates)

謂語用來查找某個特定的節點或者包含某個指定的值的節點。

謂語被嵌在方括號中。

在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:

路徑表達式結果
/ul/li[1]選取屬于 ul子元素的第一個 li元素。
/ul/li[last()]選取屬于 ul子元素的最后一個 li元素。
/ul/li[last()-1]選取屬于 ul子元素的倒數第二個 li元素。
//ul/li[position()??]選取最前面的兩個屬于 ul元素的子元素的 li元素。
//a[@title]選取所有擁有名為 title的屬性的 a元素。
//a[@title=‘xx’]選取所有 a元素,且這些元素擁有值為 xx的 title屬性。
//a[@title>10] > < >= <= !=選取 a元素的所有 title元素,且其中的 title元素的值須大于 10。
/body/div[@price>35.00]選取body下price元素值大于35的div節點

【3】選取未知節點

XPath 通配符可用來選取未知的 XML 元素。

通配符描述
*匹配任何元素節點。
@*匹配任何屬性節點。
node()匹配任何類型的節點。

實例

在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

路徑表達式結果
/ul/*選取 bookstore 元素的所有子元素。
//*選取文檔中的所有元素。
//title[@*]選取所有帶有屬性的 title 元素。
//node()獲取所有節點

【4】選取若干路徑

通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。

實例

在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

路徑表達式結果
//book/title | //book/price選取 book 元素的所有 title 和 price 元素。
//title | //price選取文檔中的所有 title 和 price 元素。
/bookstore/book/title | //price選取屬于 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素。
  • 邏輯運算

    //div[@id="head" and @class="s_down"] # 查找所有id屬性等于head并且class屬性等于s_down的div標簽
    //title | //price # 選取文檔中的所有 title 和 price 元素,“|”兩邊必須是完整的xpath路徑
    
  • 屬性查詢

    //div[@id] # 找所有包含id屬性的div節點
    //div[@id="maincontent"]  # 查找所有id屬性等于maincontent的div標簽
    //@class
    //li[@name="xx"]//text()  # 獲取li標簽name為xx的里面的文本內容
    
  • 獲取第幾個標簽 索引從1開始

    tree.xpath('//li[1]/a/text()')  # 獲取第一個
    tree.xpath('//li[last()]/a/text()')  # 獲取最后一個
    tree.xpath('//li[last()-1]/a/text()')  # 獲取倒數第二個
    
  • 模糊查詢

    //div[contains(@id, "he")]  # 查詢所有id屬性中包含he的div標簽
    //div[starts-with(@id, "he")] # 查詢所有id屬性中包以he開頭的div標簽
    //div/h1/text()  # 查找所有div標簽下的直接子節點h1的內容
    //div/a/@href   # 獲取a里面的href屬性值 
    //*  #獲取所有
    //*[@class="xx"]  #獲取所有class為xx的標簽# 獲取節點內容轉換成字符串
    c = tree.xpath('//li/a')[0]
    result=etree.tostring(c, encoding='utf-8')
    print(result.decode('UTF-8'))
    

【5】案例

豆瓣Top250基于xpath解析:

import requests
from lxml import etreeurl = "https://movie.douban.com/top250?start=0"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36"
}
resp = requests.get(url, headers=headers)tree = etree.HTML(resp.text)  # 加載頁面源代碼items = tree.xpath('//li/div[@class="item"]/div[@class="info"]')for item in items:title = item.xpath('./div[@class="hd"]/a/span[1]/text()')[0]rating_num = item.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0]comment_num = item.xpath('./div[@class="bd"]/div[@class="star"]/span[4]/text()')[0]print(title, rating_num, comment_num)

練習:基于xpath完成解析練習

import requests
from lxml import etreeres = requests.get("https://top.baidu.com/board?platform=pc&sa=pcindex_entry", )selector = etree.HTML(res.text)rets = selector.xpath('//div[@theme="car"]//div[contains(@class,"item-wrap_Z0BrP ")]')info = {}
for i in rets:name = i.xpath('./div[@class="normal_1glFU"]/a/text()')link = i.xpath('./div[@class="normal_1glFU"]/a/@href')info[name[0]] = link[0]print(info)
print(len(info))

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

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

相關文章

軟考高級第四版備考--第16天(規劃溝通管理)Plan Communication Management

定義&#xff1a;基于每個干系人或干系人群體的信息需求、可用的組織資產以及具體的項目的需求&#xff0c;為項目溝通活動制定恰當的方法和計劃的過程。 作用&#xff1a; 及時向干系人提供相關信息&#xff1b;引導干系人有效參與項目&#xff1b;編制書面溝通計劃&#xf…

【基于R語言群體遺傳學】-16-中性檢驗Tajima‘s D及連鎖不平衡 linkage disequilibrium (LD)

Tajimas D Test 已經開發了幾種中性檢驗&#xff0c;用于識別模型假設的潛在偏差。在這里&#xff0c;我們將說明一種有影響力的中性檢驗&#xff0c;即Tajimas D&#xff08;Tajima 1989&#xff09;。Tajimas D通過比較數據集中的兩個&#x1d703; 4N&#x1d707;估計值來…

vue項目中常見的一些preset及其關系

Babel的作用 Babel主要用途是用來做js代碼轉換的&#xff0c;將最新的js語法或者api轉換成低版本瀏覽器可兼容執行的代碼。 語法兼容是指一些瀏覽器新特性增加的js寫法&#xff0c;例如箭頭函數 ()>{}&#xff1b;低版本的瀏覽器無法識別這些&#xff0c;會導致一些語法解…

spark shuffle寫操作——UnsafeShuffleWriter

PackedRecordPointer 使用long類型packedRecordPointer存儲數據。 數據結構為&#xff1a;[24 bit partition number][13 bit memory page number][27 bit offset in page] LongArray LongArray不同于java中long數組。LongArray可以使用堆內內存也可以使用堆外內存。 Memor…

秋招突擊——7/9——字節面經

文章目錄 引言正文八股MySQL熟悉嗎&#xff1f;講一下MySQL索引的結構&#xff1f;追問&#xff1a;MySQL為什么要使用B樹&#xff1f;在使用MySQL的時候&#xff0c;如何避免索引失效&#xff1f;講一下MySQL的事物有哪幾種特征&#xff1f;MySQL的原子性可以實現什么效果&…

GESP C++ 三級真題(2023年9月)T2 進制判斷

進制判斷 問題描述 N進制數指的是逢N進一的計數制。例如&#xff0c;人們日常生活中大多使用十進制計數&#xff0c; 而計算機底層則一般使用二進制。除此之外&#xff0c;八進制和十六進制在一些場合也是 常用的計數制(十六進制中&#xff0c;一般使用字母A至F表示十至十五…

【區塊鏈+跨境服務】粵澳健康碼跨境互認系統 | FISCO BCOS應用案例

2020 年突如其來的新冠肺炎疫情&#xff0c;讓社會治理體系面臨前所未見的考驗&#xff0c;如何兼顧疫情防控與復工復產成為社會 各界共同努力的目標。區塊鏈技術作為傳遞信任的新一代信息基礎設施&#xff0c;善于在多方協同的場景中發揮所長&#xff0c;從 而為粵澳兩地的疫情…

uniapp上傳文件并獲取上傳進度

1. 上傳普通文件 uni.chooseMessageFile({count: 1,success: (res) > {console.log(res)console.log("res123456", res.tempFiles[0].path)const uploadTask uni.uploadFile({url: http://localhost:8000/demo,filePath: res.tempFiles[0].path,name: file,form…

CSS關于居中的問題

文章目錄 1. 行內和塊級元素自身相對父控件居中1.1. 塊級元素相對父控件居中1.2. 行內元素相對于父控件居中 2. 實現單行文字垂直居中3. 子絕父相實現子元素的水平垂直居中3.1. 方案一3.1.1. 示例 3.2. 方案二3.2.1. 示例 3.3. 方案三(推薦)3.3.1. 示例 3.4. 方案四(了解一下) …

AI大模型知識點大梳理_ai大模型的精度以下哪項描述的準確

AI大模型是什么 AI大模型是指具有巨大參數量的深度學習模型&#xff0c;通常**包含數十億甚至數萬億個參數。**這些模型可以通過學習大量的數據來提高預測能力&#xff0c;從而在自然語言處理、計算機視覺、自主駕駛等領域取得重要突破。 AI大模型的定義具體可以根據參數規模…

短信驗證碼研究:公開的短信驗證碼接口、不需要注冊的短信驗證碼接口

短信驗證碼研究&#xff1a;公開的短信驗證碼接口、不需要注冊的短信驗證碼接口 0 說明 本文提供了一個短信驗證碼接口&#xff0c;主要用于以下場景&#xff1a; 1、用于開發調試 2、用于申請驗證碼困難的企業和個人 3、用于短信驗證碼認證還沒有通過&#xff0c;但是著急…

DBeaver操作MySQL無法同時執行多條語句的解決方法

DBeaver選擇數據庫連接&#xff0c;在【驅動屬性】中將allowMultiQueries允許執行多條語句置為True

各種音頻處理器

在HiFi&#xff08;高保真&#xff09;音頻系統中&#xff0c;通常需要使用一些特定類型的音頻處理器&#xff0c;以確保音頻信號的高保真和優質輸出。以下是一些常見的音頻處理器類型及其在HiFi系統中的應用&#xff1a; DAC&#xff08;數模轉換器&#xff09;&#xff1a; …

mysql 導出導入 數據庫

導出 MySQL 數據庫可以通過多種方法實現&#xff0c;最常見的方法是使用 mysqldump 工具。以下是一些常用的導出 MySQL 數據庫的方法&#xff1a; 使用 mysqldump 工具 mysqldump 是一個命令行工具&#xff0c;用于導出 MySQL 數據庫的結構和數據。以下是基本的導出命令&…

泰迪智能科技大數據實驗室產品-實訓管理平臺介紹

高校大數據實驗室通常配備有先進的計算機硬件和軟件工具&#xff0c;以及專門的數據庫和分析平臺&#xff0c;以便研究人員和學生能夠進行復雜的數據處理、分析和解釋。主要利用大數據技術進行科學研究、技術開發和人才培養。 泰迪智能科技實訓管理平臺作為教學核心&#xff0c…

JS進階-構造函數

學習目標&#xff1a; 掌握構造函數 學習內容&#xff1a; 構造函數 構造函數&#xff1a; 封裝是面向對象思想中比較重要的一部分&#xff0c;js面向對象可以通過構造函數實現的封裝。 同樣的將變量和函數組合到了一起并能通過this實現數據的共享&#xff0c;所不同的是借助…

小程序需要進行軟件測試嗎?小程序測試有哪些測試內容?

在如今移動互聯網快速發展的時代&#xff0c;小程序已成為人們生活中不可或缺的一部分。然而&#xff0c;面對日益增長的小程序數量和用戶需求&#xff0c;小程序的穩定性和質量問題日益突顯。因此&#xff0c;對小程序進行軟件測試顯得尤為重要。 近期的一項調查顯示&#xf…

【架構】分布式與微服務架構解析

分布式與微服務架構解析 一、分布式1、什么是分布式架構2、為什么需要分布式架構3、分布式架構有哪些優勢&#xff1f;4、分布式架構有什么劣勢&#xff1f;5、分布式架構有哪些關鍵技術&#xff1f;6、基于分布式架構如何提高其高性能&#xff1f;7、如何基于架構提高系統的穩…

【工具】咸魚小助手,一款咸魚之王輔助工具

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ Github&#xff1a;咸魚之王的自動化腳本&#xff0c;自動答題、爬塔、領資源等 下載&#xff1a;(密碼:9u22) 咸魚小助手 文檔&#xff1a;騰訊文檔 視…

軟考《信息系統運行管理員》-3.2信息系統設施運維的環境管理

3.2信息系統設施運維的環境管理 1 計算機機房的選址要求 電子計算機機房地理位置 選擇水源充足&#xff0c;電子比較穩定可靠&#xff0c;交通通信方便&#xff0c;自然環境清潔的地點要遠離產生粉塵、油煙、有害氣體以及生產或存儲具有腐蝕性、易燃、易爆物品的工廠、倉庫、…