python爬蟲數據解析xpath、jsonpath,bs4

數據的解析

解析數據的方式大概有三種

  • xpath
  • JsonPath
  • BeautifulSoup

xpath

?安裝xpath插件

打開谷歌瀏覽器擴展程序,打開開發者模式,拖入插件,重啟瀏覽器,ctrl+shift+x,打開插件頁面

安裝lxml庫?

安裝在python環境中的Scripts下邊,這里就是python庫的位置,例如我的地址為:E:\python\python3.10.11\Scripts

pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple

xpath使用和基本語法

解析本地文件etree.parse( 'xx.html')4.etree.HTML()

解析服務器響應文件html_tree = etree.HTML(response.read().decode( 'utf-8')4.html tree.xpath(xpath路徑)

xpath基本語法:

路徑查詢

????????// : 查找所有子孫節點,不考慮層級關系

????????/? :找直接子節點

謂詞查詢

????????//div[@id] :包含id屬性的div

????????//div[@id="maincontent"] :id = maincontent的div

屬性查詢

????????//@class :? ?返回指定標簽的class屬性

模糊查詢

????????//div[contains(@id,"he")] 包含

? ? ????//div[starts-with(@id,"he")] :以he開頭

內容查詢

????????//div/h1/text() : text()顯示內容

邏輯運算

? ????//div[@id="head" and @class="s down"] : 邏輯&&?

xpath解析本地文件?

本地文件如下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"/><title>Title</title>
</head>
<body><ul><li id="00" class="beijing">北京</li><li>上海</li><li>深圳</li><li>廣州</li></ul><ul><li id="11" class="shenyang">沈陽</li><li>南京</li></ul>
</body>
</html>

解析本地文件

from lxml import etree# 解析本地文件 使用etree.parse
tree = etree.parse('Test.html')# 找到所有的ul
ul_list = tree.xpath("//ul")# 查找所有的li
li_list = tree.xpath("//ul/li")# 查找所有包含id的li
id_li_list = tree.xpath("//ul/li[@id]")# 查找id為00的li,并找到內容 注意引號問題
content_list = tree.xpath("//ul/li[@id='00']/text()")# 查找id包含0的li的內容
contains_list = tree.xpath("//ul/li[contains(@id,'0')]/text()")# 獲取id為11的li class屬性值@class
li = tree.xpath("//ul/li[@id='11']/@class")
print(ul_list)print(li_list)print(id_li_list)print(contains_list)print(content_list)print(li)"""
輸出結果:
[<Element ul at 0x22c26c38240>, <Element ul at 0x22c26c38600>]
[<Element li at 0x22c26c38640>, <Element li at 0x22c26c385c0>, <Element li at 0x22c26c38680>, <Element li at 0x22c26c386c0>, <Element li at 0x22c26c38700>, <Element li at 0x22c26c38780>]
[<Element li at 0x22c26c38640>, <Element li at 0x22c26c38700>]
['北京']
['北京']
['shenyang']
"""

xpath解析服務器文件?

使用xpath插件檢查xpath路徑的匹配,解析定位dom

from lxml import etree
import urllib.request as request# 下載圖片
url = "https://www.baidu.com/"headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}# 構建的請求對象
geneRequest=request.Request(url=url,headers = headers)
# 模擬瀏覽器發送請求
response = request.urlopen(geneRequest)
# 獲取內容
content = response.read().decode('utf-8')# 解析服務器文件
tree = etree.HTML(content)# 找到百度一下的值
result = tree.xpath('//input[@id="su"]/@value')print(result)"""
輸出結果:['百度一下']
"""

jsonpath

jsonpath是一種信息抽取類庫,是從JSON文檔中抽取指定信息的工具,只能讀取本地的json文件,與xpath類似,只不過對應符號不同

?jsonpath安裝

pip install jsonpath -i https://pypi.tuna.tsinghua.edu.cn/simple

xpath和jsonpath的對應關系?

XPath?? ?JSONPath?描述
/??$?根節點
.?@?現行節點
/.or[]取子節點
、、n/a取父節點,Jsonpath未支持
//?、、就是不管位置,選擇所有符合條件的條件
*?*?匹配所有元素節點
@n/a?根據屬性訪問,Json不支持,因為Json是個Key-value遞歸結構,不需要
[]?[]?迭代器標識(可以在里邊做簡單的迭代操作,如數組下標,根據內容選值等
[]??()支持過濾操作
|[,]支持迭代器中做多選
n/a()支持表達式計算
()n/a分組,JsonPath不支持

jsonpath解析

準備json

  {"store": {"book":[{ "category": "射手","author": "魯班七號","title": "王者榮耀","price": 8.95},{"category": "打野","author": "李白","title": "大河之水天上來","price": 22.99}],"bicycle": {"color": "red","price": 19.95}}}

?通過jsonpath解析json數據

import json
import jsonpathobj = json.load(open('test.json',"r",encoding="utf-8"))# 查看store下的bicycle的color屬性 $ 對應xpath/
colorAttr = jsonpath.jsonpath(obj, "$.store.bicycle.color")# 輸出book節點的第一個對象
bookFirst = jsonpath.jsonpath(obj, "$.store.book[0]")# 輸出book節點中所有對象對應的屬性title值
titles = jsonpath.jsonpath(obj, "$.store.book[*].title")# 輸出book節點中所有價格小于10的對象 ?() 對應xpath  [] @ 對應當前節點
books = jsonpath.jsonpath(obj, "$.store.book[?(@.price<10)]")print(colorAttr)print(bookFirst)print(titles)print(books)"""
輸出結果:
['red']
[{'category': '射手', 'author': '魯班七號', 'title': '王者榮耀', 'price': 8.95}]
['王者榮耀', '大河之水天上來']
[{'category': '射手', 'author': '魯班七號', 'title': '王者榮耀', 'price': 8.95}]
"""

BeautifulSoup

Beautifulsoup簡稱bs4,Beautifulsoup,和lxml一樣,是一個html的解析器,主要功能也是解析和提取數據

  • 缺點: 效率沒有1xm1的效率高
  • 優點: 接口設計人性化,使用方便

BeautifulSoup安裝

pip install bs4  - i  https://pypi.tuna.tsinghua.edu.cn/simple

?BeautifulSoup節點定位規則

soup =?soup = Beautifulsoup(response.read().decode(),'Ixml') 解析服務器文件

soup =?soup = Beautifulsoup(open('1.html').lxml')? 解析本地文件

根據標簽名查找節點
????????soup.a? 只能找到第一個a
????????soup.a.namesoup.a.attrs???獲取標簽的屬性和屬性值

函數查找

? .find (返回一個對象?只能找到第一個a標簽)

? ? ? ? find('a')

? ? ? ? find('a',title='名字')

? ? ? ? find('a',class='名字')

? .find_all (返回一個列表 )

????????find all('a')?

????????find all(['a’,'span']) 返回所有的a和span

? .select(根據選擇器得到節點對象)[推薦]

????????element

? ? ? ? ? ? ? ? eg: div

????????class

? ? ? ? ? ? ? ? eg:.firstname

????????id

? ? ? ? ? ? ? ? eg:#firstname

????????屬性選擇器

????????????????eg:li = soup.select('li[class]')

????????????????eg:li = soup.select('li[class="hengheng"]')

????????層級選擇器

????????????????element element

? ? ? ? ? ? ? ? ? ????????div p

????????????????????????????????eg:soup = soup.select('a span')

????????????????element>element

? ? ? ? ? ? ? ? ? ? ? ? ??div>p

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??eg:soup = soup.select('a>span')

????????????????element,element

? ? ? ? ? ? ? ? ? ? ? ? ? div,p

????????????????????????????????eg:soup = soup.select('a,span')

BeautifulSoup節點信息

獲取節點內容

????????obj.string

????????obj.get_text()[推薦]?

獲取節點的屬性

????????eg:tag = find('li)

????????????????tag.name 獲取標簽名

????????????????tag.attrs將屬性值作為一個字典返回

獲取節點屬性

????????obj.attrs.get('title')[常用]

????????obj.get('title')

????????obj['title']

BeautifulSoup解析文件

以上述xpath中的本地文件Test.html為例,上邊已經寫過,這里直接上代碼

from bs4 import BeautifulSoupsoup = BeautifulSoup(open('Test.html',encoding='utf-8'),'lxml')# 查找第一個ul
print(soup.find("ul"))# 查找所有的ul
print(soup.find_all("ul"))# 選擇查找 li class為beijing的標簽
print(soup.select("li[class =beijing]"))#層級選擇查找ul下的class為beijing的li節點
nodeli=soup.select("ul li[class = beijing]")[0]# 獲取li節點內容
print(nodeli.get_text())# 獲取li標簽名
print(nodeli.name)#獲取li的屬性
print(nodeli.attrs)# 獲取li的id屬性
print(nodeli.attrs.get('id'))"""
輸出結果:
<ul>
<li class="beijing" id="00">北京</li>
<li>上海</li>
<li>深圳</li>
<li>廣州</li>
</ul>
[<ul>
<li class="beijing" id="00">北京</li>
<li>上海</li>
<li>深圳</li>
<li>廣州</li>
</ul>, <ul>
<li class="shenyang" id="11">沈陽</li>
<li>南京</li>
</ul>]
[<li class="beijing" id="00">北京</li>]
北京
li
{'id': '00', 'class': ['beijing']}
00"""

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

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

相關文章

劍指Offer61.撲克牌中的順子 C++

1、題目描述 從若干副撲克牌中隨機抽 5 張牌&#xff0c;判斷是不是一個順子&#xff0c;即這5張牌是不是連續的。2&#xff5e;10為數字本身&#xff0c;A為1&#xff0c;J為11&#xff0c;Q為12&#xff0c;K為13&#xff0c;而大、小王為 0 &#xff0c;可以看成任意數字。…

并發服務器模型,多線程并發

一、多線程并發完整代碼 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> #include <…

突然讓做性能測試?試試RunnerGo

當前&#xff0c;性能測試已經是一名軟件測試工程師必須要了解&#xff0c;甚至熟練使用的一項技能了&#xff0c;在工作時可能每次發版都要跑一遍性能&#xff0c;跑一遍自動化。性能測試入門容易&#xff0c;深入則需要太多的知識量&#xff0c;今天這篇文章給大家帶來&#…

Rocky Linux更換為國內源

Rocky Linux提供的可供切換的源列表&#xff1a;Mirrors - Mirror Manager 其中以 COUNTRY 列為 CN 的是國內源。 選擇其中一個Rocky Linux 源使用幫助 — USTC Mirror Help 文檔 操作前請做好備份 對于 Rocky Linux 8&#xff0c;使用以下命令替換默認的配置 sed -e s|^mirr…

新能源汽車電控系統

新能源汽車電控系統主要分為&#xff1a;三電系統電控系統、高壓系統電控系統、低壓系統電控系統 三電系統電控系統 包括整車控制器、電池管理系統、驅動電機控制器等。 整車控制器VCU 整車控制器作為電動汽車中央控制單元&#xff0c;是整個控制系統的核心&#xff0c;也是…

zabbix監控mysql數據庫、nginx、Tomcat

zabbix監控mysql數據庫、nginx、Tomcat 一.zabbix監控mysql數據庫 1.環境規劃 hostIP部署zabbix-server192.168.198.17zabbix服務器搭建zabbix-mysql192.168.198.15zabbix客戶端搭建 2.zabbix-server安裝部署&#xff08;192.168.198.17&#xff09; 請參考以下配置&#…

Azure概念介紹

云計算定義 云計算是一種使用網絡進行存儲和處理數據的計算方式。它通過將數據和應用程序存儲在云端服務器上&#xff0c;使用戶能夠通過互聯網訪問和使用這些資源&#xff0c;而無需依賴于本地硬件和軟件。 發展歷史 云計算的概念最早可以追溯到20世紀60年代的時候&#x…

mysql 分庫分表淺析

分表是分散數據庫壓力的好方法。 分表&#xff0c;最直白的意思&#xff0c;就是將一個表結構分為多個表&#xff0c;然后&#xff0c;可以再同一個庫里&#xff0c;也可以放到不同的庫。 當然&#xff0c;首先要知道什么情況下&#xff0c;才需要分表。個人覺得單表記錄條數達…

2023河南萌新聯賽第(五)場:鄭州輕工業大學C-數位dp

鏈接&#xff1a;登錄—專業IT筆試面試備考平臺_牛客網 給定一個正整數 n&#xff0c;你可以對 n 進行任意次&#xff08;包括零次&#xff09;如下操作&#xff1a; 選擇 n 上的某一數位&#xff0c;將其刪去&#xff0c;剩下的左右部分合并。例如 123&#xff0c;你可以選擇…

年至年的選擇仿elementui的樣式

組件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 時間選擇年 - 年 --> <template><div class"yearPicker"…

Smart HTML Elements 16.1 Crack

Smart HTML Elements 是一個現代 Vanilla JS 和 ES6 庫以及下一代前端框架。企業級 Web 組件包括輔助功能&#xff08;WAI-ARIA、第 508 節/WCAG 合規性&#xff09;、本地化、從右到左鍵盤導航和主題。與 Angular、ReactJS、Vue.js、Bootstrap、Meteor 和任何其他框架集成。 智…

九、多態(2)

本章概要 構造器和多態 構造器調用順序繼承和清理構造器內部多態方法的行為 協變返回類型使用繼承設計 替代 vs 擴展向下轉型與運行時類型信息 構造器和多態 通常&#xff0c;構造器不同于其他類型的方法。在涉及多態時也是如此。盡管構造器不具有多態性&#xff08;事實上…

【JavaScript】new 的原理以及實現

網道 - new 命令的原理 使用new命令時&#xff0c;它后面的函數依次執行下面的步驟。 創建一個空對象&#xff0c;作為將要返回的對象實例。將這個空對象的原型&#xff0c;指向構造函數的prototype屬性。將這個空對象賦值給函數內部的this關鍵字。如果構造函數返回了一個對象…

版本動態 | SolidUI 0.2.0 版本發布

SolidUI 一句話生成任何圖形 背景 隨著文本生成圖像的語言模型興起&#xff0c;SolidUI想幫人們快速構建可視化工具&#xff0c;可視化內容包括2D,3D,3D場景&#xff0c;從而快速構三維數據演示場景。SolidUI 是一個創新的項目&#xff0c;旨在將自然語言處理&#xff08;NLP&…

[SpringCloud] 組件性能優化技巧

Feign 配置優化hystrix配置 優化ribbon 優化Servlet 容器 優化Zuul配置 優化 文章目錄 1.Servlet 容器 優化2.Feign 配置優化3.Zuul配置 優化4.hystrix配置 優化5.ribbon 優化 1.Servlet 容器 優化 默認情況下, Spring Boot 使用 Tomcat 來作為內嵌的 Servlet 容器, 可以將 We…

在Visual Studio上,使用OpenCV實現人臉識別

1. 環境與說明 本文介紹了如何在Visual Studio上&#xff0c;使用OpenCV來實現人臉識別的功能 環境說明 : 操作系統 : windows 10 64位Visual Studio版本 : Visual Studio Community 2022 (社區版)OpenCV版本 : OpenCV-4.8.0 (2023年7月最新版) 實現效果如圖所示&#xff0…

Linux命令200例:adduser用于創建新用戶

&#x1f3c6;作者簡介&#xff0c;黑夜開發者&#xff0c;全棧領域新星創作者?。CSDN專家博主&#xff0c;阿里云社區專家博主&#xff0c;2023年6月csdn上海賽道top4。 &#x1f3c6;數年電商行業從業經驗&#xff0c;歷任核心研發工程師&#xff0c;項目技術負責人。 &…

代理模式【Proxy Pattern】

什么是代理模式呢&#xff1f;我很忙&#xff0c;忙的沒空理你&#xff0c;那你要找我呢就先找我的代理人吧&#xff0c;那代理人總要知道 被代理人能做哪些事情不能做哪些事情吧&#xff0c;那就是兩個人具備同一個接口&#xff0c;代理人雖然不能干活&#xff0c;但是被 代…

解決 Mac 上使用 Electron Updater 更新 App 不成功的問題!!!

文章目錄 1. 現象2. 分析并如何解決3. 后續 1. 現象 在Mac電腦上&#xff0c;使用Electron Updater對程序進行更新&#xff0c;但是一直不成功&#xff0c;也不報錯。具體表現是這樣的&#xff1a;當前我的程序版本是3.11版本&#xff0c;點擊更新之后&#xff0c;也下載了&am…

11 迭代器|生成器|協程

文章目錄 迭代器可迭代對象可迭代對象的本質iter()函數與 next()函數迭代器 Iterator樣例 for...in...循環的本質使用的場景--斐波那契數列list和tuple也可以接收可迭代對象 生成器簡介創建生成器方法一方法二總結 使用 send 喚醒 協程協程和線程差異簡單實現協程greenletgeven…