網頁數據的解析提取(parsel的使用)

? ? ? ? 前面,我們已經介紹了Xpath庫和Beautiful Soup庫(支持css選擇器)來提取頁面信息。它們有各自的優缺點,那可不可以取長補短呢?當然可以,parsel庫就是結合Xpath和css選擇器兩種方式來提取網頁信息。同時,Python爬蟲有一個最流行的Scrapy框架,parsel就是它的底層支持。了解了它,后面學習Scrapy選擇器的用法就非常方便了!!!

目錄

Parsel

1、準備工作

2、案例

3、提取文本?

(1)Xpath的提取方法

(2)css選擇器提取方法

4、提取屬性

5、正則提取


Parsel

1、準備工作

使用前要先安裝parsel庫,安裝命令如下:

pip3 install parsel

2、案例

????????為了讓讀者更加能清晰感受到parsel庫,首先來看一下一個示例:

# html代碼
html = '''
<div><ul><li class="item-0">firsst item</li><li class="item-1"><a href="link2.html">secomd item</a> </li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span> </a> firsst item</li><li class="item-1 active"><a href="link4.html">fourth item</a> </li><li class="item-0"><a href="link5.html">fifth item</a> </li></ul> 
</div>
'''
# 導包
from parsel import Selector
# 創建一個Selector對象,向其中傳入text參數,傳入的就是上面的html代碼
selector = Selector(html)
# 有了Selector對象,我們就可以使用css和xpath方法
# 這里用css選擇器選擇class為item-0的節點
items = selector.css('.item-0')
# 打印該節點的長度 類型 信息
print(len(items),type(items),items)
# 分隔行
print()
# 這里我們用xpath的方式提取li節點提取class為item-0的節點
items2 = selector.xpath('//li[contains(@class, "item-0")]')
# 打印該節點的長度 類型 信息
print(len(items2),type(items2),items2)
# 這兩種方式得到的結果是一樣的

結果如下:

3 <class 'parsel.selector.SelectorList'> [<Selector query="descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]" data='<li class="item-0">firsst item</li>'>, <Selector query="descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]" data='<li class="item-0 active"><a href="li...'>, <Selector query="descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]" data='<li class="item-0"><a href="link5.htm...'>]3 <class 'parsel.selector.SelectorList'> [<Selector query='//li[contains(@class, "item-0")]' data='<li class="item-0">firsst item</li>'>, <Selector query='//li[contains(@class, "item-0")]' data='<li class="item-0 active"><a href="li...'>, <Selector query='//li[contains(@class, "item-0")]' data='<li class="item-0"><a href="link5.htm...'>]

????????可以看到兩個結果都是SelectorList對象,這其實是一個可迭代對象。用len 方法獲取了結果的長度,都是3。另外,提取結果代表的節點也是一樣的,都是第1、3、5個li節點,每個節點還是以Selector 對象的形式返回, 其中每個 Selector 對象的 data屬性里包含對應提取節點的 HTML 代碼。

????????這里大家可能會有個疑問,第一次不是用css方法提取的節點嗎? 為什么結果中的 Selector對象輸出的是xpath屬性而不是css屬性? 這是因為在css方法的背后,我們傳入的 CSS 選擇器首先是被轉成了 XPath,真正用于節點提取的是XPath。其中CSS選擇器轉換為 XPath的過程是由底層的 cssselect?這個庫實現的, 例如.item-0這個CSS 選擇器轉換為 XPath的結果就是 descendant-or-self::*[@class?and contains(concat(' ' , normalize-space(@class), ' '), ' item-o ')],?因此輸出的 Selector 對象就有了xpath屬性。不過大家不用擔心,這個對提取結果是沒有影響的,僅僅是換了一個表示方法而已。

3、提取文本?

? ? ? ? 提取文本只需采用xpath或者css選擇器的方式去獲取即可。由于Selector對象是一個可迭代對象,這里我們需要進行遍歷然后再選擇Xpath或css選擇器的方式去提取。

(1)Xpath的提取方法

? ? ? ? 首先演示一下用Xpath方式去獲取文本,Xpath是用text()方法來提取節點的文本,但提取的只是Selector構成的可迭代對象SelectorList。SelectorList中有一個get方法,可以獲取第一個Selector對象的文本內容;getall方法則獲取所有Selector對象的文本內容。代碼如下:

# html代碼
html = '''
<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">secomd item</a> </li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span> </a> firsst item</li><li class="item-1 active"><a href="link4.html">fourth item</a> </li><li class="item-0"><a href="link5.html">fifth item</a> </li></ul> 
</div>
'''
from parsel import Selector
selector = Selector(html)
#  采用css選擇器選擇目標節點
items = selector.css('.item-0')
# 因為Selector是一個可迭代的對象,它是有列表組成的。所以可以遍歷提取所需要的信息
for item in items:# 采用Xpath方式提取文本信息,Selector中有一個get方法,它是用來提取所獲取第一個節點的文本內容# text = item.xpath('.//text()').get()# print(text)# 采用Xpath方式提取文本信息,Selector中有一個getall方法,它是用來提取所獲取所有的節點文本內容text2 = item.xpath('.//text()').getall()print(text2)

結果如下:

first item
['first item']
third item
['third item', ' ', ' firsst item']
fifth item
['fifth item', ' ']

(2)css選擇器提取方法

? ? ? ? css選擇器是通過::text來提取文本的,采用css選擇器定位到所需要的節點,然后加上::text,但它返回的也是Selector對象構成的SelectorList對象,所以也是跟上面一樣,加上get方法或getall方法。?

# html代碼
html = '''
<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">secomd item</a> </li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span> </a> firsst item</li><li class="item-1 active"><a href="link4.html">fourth item</a> </li><li class="item-0"><a href="link5.html">fifth item</a> </li></ul> 
</div>
'''
from parsel import Selector
selector = Selector(html)
#  采用css選擇器選擇目標節點
items = selector.css('.item-0')
# 因為Selector是一個可迭代的對象,它是有列表組成的。所以可以遍歷提取所需要的信息
for item in items:# 采用Xpath方式提取文本信息,Selector中有一個get方法,它是用來提取所獲取第一個節點的文本內容text = item.css('::text').get()print(text)# 采用Xpath方式提取文本信息,Selector中有一個getall方法,它是用來提取所獲取所有的節點文本內容text2 = item.css('::text').getall()print(text2)

結果如下:

C:\Users\Lenovo\AppData\Local\Programs\Python\Python311\python.exe C:\Users\Lenovo\Desktop\爬蟲學習\Python知識\parsel庫\提取文本2.py 
first item
['first item']
third item
['third item', ' ', ' firsst item']
fifth item
['fifth item', ' ']進程已結束,退出代碼為 0

4、提取屬性

? ? ? ? 提取屬性的方式更上面類似,直接采用xpath提取屬性的方法:選中節點后加上/@再加屬性名稱;css選擇器提取屬性的方法加::attr(),往里面傳入對應的屬性名稱。示例如下:

# html代碼
html = '''
<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">secomd item</a> </li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span> </a> firsst item</li><li class="item-1 active"><a href="link4.html">fourth item</a> </li><li class="item-0"><a href="link5.html">fifth item</a> </li></ul> 
</div>
'''
from parsel import Selector
selector = Selector(text=html)
# css選擇器提取屬性的方式
result = selector.css('.item-0.active a::attr(href)').get()
print(result)
# xpath提取屬性的方式
result = selector.xpath('//li[contains(@class, "item-0") and contains(@class, "active")]/a/@href').get()
print(result)

結果如下:

link3.html
link3.html

5、正則提取

? ? ? ? Selector對象還提供正則表達式的提取方法。可以先采用css選擇器或xpath選擇器選中所需要的目標節點,然后調用Selector對象的re方法輸入正則表達式來匹配,其匹配選中節點所有符合正則表達式的內容;re_first方法輸入正則表達式來匹配,其匹配選中節點第一個符合正則表達式的內容。示例如下:

# html代碼
html = '''
<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">secomd item</a> </li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span> </a> firsst item</li><li class="item-1 active"><a href="link4.html">fourth item</a> </li><li class="item-0"><a href="link5.html">fifth item</a> </li></ul> 
</div>
'''
from parsel import Selector
selector = Selector(text=html)
# 選用css選擇器選中目標節點,再用re方法輸入正則表達式來匹配,其匹配選中節點所有符合正則表達式的內容
result = selector.css('.item-0').re('link.*')
print(result)
# 選用css選擇器選中目標節點,再用re_first方法輸入正則表達式來匹配,其匹配選中節點第一個符合正則表達式的內容
result = selector.css('.item-0').re_first('<span class="bold">(.*?)</span>')
print(result)

結果如下:

['link3.html"><span class="bold">third item</span> </a> firsst item</li>', 'link5.html">fifth item</a> </li>']
third item

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

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

相關文章

sylar高性能服務器-日志(P30-P35)內容記錄

文章目錄 P30-P32&#xff1a;協程調度01-03一、Scheduler局部變量FiberAndThread&#xff08;任務結構體&#xff09;成員變量調度協程構造函數析構函數startstoprunstopping 二、參考資料 P33-P35&#xff1a;協程調度04-06一、測試1二、測試2 總結 P30-P32&#xff1a;協程調…

開源博客項目Blog .NET Core源碼學習(9:Autofac使用淺析)

開源博客項目Blog使用Autofac注冊并管理組件和服務&#xff0c;Autofac是面向.net 的開源IOC容器&#xff0c;支持通過接口、實例、程序集等方式注冊組件和服務&#xff0c;同時支持屬性注入、方法注入等注入方式。本文學習并記錄Blog項目中Autofac的使用方式。 ??整個Blog解…

Swift基礎知識:28.Swift協議

在 Swift 中&#xff0c;協議&#xff08;protocol&#xff09;是一種定義方法、屬性和其他特定任務的藍圖。類、結構體或枚舉可以遵循&#xff08;adopt&#xff09;協議&#xff0c;從而提供所需的功能。協議定義了一組要求&#xff0c;遵循協議的類型需要提供對應的功能實現…

LED景觀照明燈驅動電路串聯、并聯和恒流3款方案

LED景觀照明燈是現代城市照明中常見的一種燈具。為了保證LED景觀照明燈的正常工作&#xff0c;需要設計合適的驅動電路。LED景觀照明燈的驅動電路可以采用串聯、并聯或恒流的方式來設計。 首先&#xff0c;串聯驅動電路是指將多個LED燈串聯在一起&#xff0c;然后接入電源進行…

【Spring】常見問題總結

目錄 1. 什么是 Spring 框架? 2. 列舉一些重要的Spring模塊&#xff1f; 3. RestController vs Controller 4. Spring IOC & AOP 4.1 談談自己對于 Spring IoC 和 AOP 的理解 IoC AOP 4.2 Spring AOP 和 AspectJ AOP 有什么區別&#xff1f; 5. Spring bean 5.1…

C語言第二十九彈---浮點數在內存中的存儲

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】 目錄 1、浮點數在內存中的存儲 1.1、練習 1.2、浮點數怎么轉化為二進制 1.3、浮點數的存儲 1.3.1、浮點數存的過程 1.3.2、浮點數取的過程 1.3、題目解析…

FPGA領域頂級學術會議

FPGA領域頂級學術會議主要有FPGA,FCCM,FPL和FPT。 1 FPGA 會議全名是: ACM/SIGDA International Symposium on Field-Programmable Gate Arrays 網站是:https://dl.acm.org/conference/fpga FPGA常年在美國舉辦,每年2月,偏FPGA基礎研究; 該會議的論文免費下載。這個比…

【MATLAB源碼-第144期】基于matlab的蝴蝶優化算法(BOA)無人機三維路徑規劃,輸出做短路徑圖和適應度曲線。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 ?蝴蝶優化算法&#xff08;Butterfly Optimization Algorithm, BOA&#xff09;是基于蝴蝶覓食行為的一種新穎的群體智能算法。它通過模擬蝴蝶個體在尋找食物過程中的嗅覺導向行為以及隨機飛行行為&#xff0c;來探索解空間…

vue3前端項目開發,具備純天然的防止爬蟲采集的特征

vue3前端項目開發,具備純天然的防止爬蟲采集的特征&#xff01;眾所周知&#xff0c;網絡爬蟲可以在網上爬取到一些數據&#xff0c;很多公司&#xff0c;為了自己公司的數據安全&#xff0c; 尤其是web端項目&#xff0c;不希望被爬蟲采集。那么&#xff0c;您可以使用vue技術…

spark ui的job數,stage數以及task數

背景 我們在查看spark ui的界面時&#xff0c;一段spark sql的執行經常看到會有對應有幾個job&#xff0c;然后每個job又有幾個stage&#xff0c;而每個stage又有好多個task&#xff0c;那么這些job,stage,task是怎么和spark 算子對應的呢 算子和job數,stage數以及task數的對…

代碼隨想錄算法訓練營29期|day59 任務以及具體安排

第九章 動態規劃part16 583. 兩個字符串的刪除操作 // dp數組中存儲word1和word2最長相同子序列的長度 class Solution {public int minDistance(String word1, String word2) {int len1 word1.length();int len2 word2.length();int[][] dp new int[len1 1][len2 1];for …

Gartner信息圖:2024 年44種安全和風險管理技術采用路線圖

Gartner發布的該信息圖確定了全球企業正在采用的 44 種安全相關技術&#xff0c;并根據采用階段、部署風險和企業價值對它們進行了映射。安全和風險管理領導者可以使用此信息圖將他們的技術投資與同行進行比較。 2024 年安全和風險管理技術采用路線圖 SRM 領導者可以使用此信息…

世微AP8P059 靜態功耗小 太陽能人體紅外線感應IC

概述 AP8P059 是一款集成低壓 LDO 、光 控、充電控制、過充保護、欠壓保護、 PIR 感應、延時為一體的人體感應太陽能 LED 燈控制芯片&#xff0c;只需要很少的外接元件&#xff0c;適 用于鋰電池供電的 PIR 人體感應 LED 燈具 的應用。 外置的一級帶通增益放大 器便…

Python實現視頻轉音頻、音頻轉文本的最佳方法

文章目錄 Python實現視頻轉音頻和音頻轉文字視頻轉音頻步驟 1&#xff1a;導入moviepy庫步驟 2&#xff1a;選擇視頻文件步驟 3&#xff1a;創建VideoFileClip對象步驟 4&#xff1a;提取音頻步驟 5&#xff1a;保存音頻文件 音頻轉文字步驟 1&#xff1a;導入SpeechRecognitio…

RV新聞概要 --- 2024/02/23

來源&#xff1a;https://mp.weixin.qq.com/s/EEJVLQnXvgQTbtU_yrW9lw 晶心科技是一家上市公司&#xff08;TWSE&#xff1a;6533&#xff1b;SIN&#xff1a;US03420C2089&#xff1b;ISIN&#xff1a;US03420C1099&#xff09;&#xff0c;已有18 年的經營歷史&#xff0c;是…

單向循環鏈表的操作

main函數&#xff1a; #ifndef __loopLinkList_H__#define __loopLinkList_H__typedef int datatype;union msg{ //若數據的類型也為int&#xff0c;則不需要這個聯合體datatype data;int len; //放頭結點&#xff0c;記錄鏈表長度};typedef struct node{union msg te…

Istio實戰:Istio Kiali部署與驗證

目錄 前言一、Istio安裝小插曲 注意事項 二、Kiali安裝三、Istio測試參考資料 前言 前幾天我就開始搗騰Istio。前幾天在執行istioctl install --set profiledemo -y 的時候老是在第二步就報錯了&#xff0c;開始我用的istio版本是1.6.8。 后面查看k8s與istio的版本對應關系后發…

vCenter、vSphere Client硬盤擴容詳解

文章目錄 1、需求2、vSphere 操作流程3、服務器操作3.1、查看分區空間大小3.2、列出所有可用塊設備的信息3.3、新建分區3.4、重讀分區表信息3.5、格式化分區信息3.6、查看卷組的詳細狀態3.7、創建物理卷3.8、擴容卷組3.9、邏輯卷在線擴容3.10、顯示物理卷屬性3.11、XFS 文件系統…

最少停車數(C 語言)

題目描述 特定大小的停車場&#xff0c;數組cars[]表示&#xff0c;其中1表示有車&#xff0c;0表示沒車。車輛大小不一&#xff0c;小車占一個車位&#xff08;長度1&#xff09;&#xff0c;貨車占兩個車位&#xff08;長度2&#xff09;&#xff0c;卡車占三個車位&#xf…

Rollup + Ts

Rollup Ts RollupTs demo 一、文件配置 | - src | | - utils | | | - .ts | | - .babelrc | | - main.js | | - style.css | - package.json | - rollup.config.js | - tsconfig.json二、插件下載 rollup // rollup 基本的包 typescript // ts 包 rollup/plug…