數據分析和可視化:Py爬蟲-XPath解析章節要點總結

重要知識點

  • XPath 概述:XPath 是一門可以在 XML 文件中查找信息的語言,也可用于 HTML 文件。它功能強大,提供簡潔明了的路徑表達式和多個函數,用于字符串、數值、時間比較等。1999 年成為 W3C 標準,常用于爬蟲中抓取網頁信息。

  • XPath 解析操作:在 Python 中,常用 lxml 模塊進行 XPath 解析,該模塊底層用 C 語言編寫,解析效率高。需通過“pip install lxml”命令安裝。

    • 解析 HTML:有 parse()方法用于解析本地 HTML 文件;HTML()方法用于解析字符串類型的 HTML 代碼和服務器返回的 HTML 代碼。

    • 獲取所有節點:使用“//*”獲取 HTML 代碼中的所有節點。

    • 獲取子節點:用“/”獲取直接子節點,“//”獲取子孫節點。

    • 獲取父節點:使用“..”獲取一個節點的父節點。

    • 獲取文本:用 text()方法獲取 HTML 代碼中的文本。

    • 屬性匹配:使用“[@]”實現節點屬性的匹配,包括單屬性、多屬性匹配以及屬性多值匹配。

  • 案例:爬取豆瓣電影 Top250 中的電影信息

    • 分析請求地址:豆瓣電影 Top250 首頁有 10 頁內容,每頁 25 個電影信息。每頁的 URL 地址規律為間隔“25”。

    • 分析信息位置:通過瀏覽器“開發者工具”查看電影名稱、導演、主演、電影評分等信息對應的 HTML 代碼位置。

    • 爬蟲代碼實現:使用 requests 模塊發送網絡請求,lxml 模塊中的 XPath 解析器提取電影的相關信息。

相應重要代碼

# 導入 etree 子模塊
from lxml import etree# 8.2.1 解析本地的 HTML 文件
parser = etree.HTMLParser()
html = etree.parse("demo.html", parser=parser)
html_txt = etree.tostring(html, encoding="utf-8")
print(html_txt.decode('utf-8'))# 8.2.2 解析字符串類型的 HTML 代碼
html_str = """
<html><head><title>標題文檔</title></head><body><img src="./demo_files/logo1.png" /><br />hello 明日科技</body>
</html>
"""
html = etree.HTML(html_str)
html_txt = etree.tostring(html, encoding="utf-8")
print(html_txt.decode('utf-8'))# 8.2.3 解析服務器返回的 HTML 代碼(示例為發送網絡請求后解析)
import requests
from requests.auth import HTTPBasicAuth
url = 'http://example.com'
auth = HTTPBasicAuth('admin', 'admin')
response = requests.get(url=url, auth=auth)
if response.status_code == 200:html = etree.HTML(response.text)html_txt = etree.tostring(html, encoding="utf-8")print(html_txt.decode('utf-8'))# 8.2.4 獲取所有節點
html_str = """
<div class="level_one on"><ul><li><a href="/index/index/view/id/1.html" title="什么是 Java" class="on">什么是 Java</a></li><li><a href="javascript:" onclick="login(0)" title="Java 的版本">Java 的版本</a></li><li><a href="javascript:" onclick="login(0)" title="Java API 文檔">Java API 文檔</a></li><li><a href="javascript:" onclick="login(0)" title="JDK 的下載">JDK 的下載</a></li><li><a href="javascript:" onclick="login(0)" title="JDK 的安裝">JDK 的安裝</a></li><li><a href="javascript:" onclick="login(0)" title="配置 JDK">配置 JDK</a></li></ul>
</div>
"""
html = etree.HTML(html_str)
node_all = html.xpath("//*")
print("數據類型:", type(node_all))
print("數據長度:", len(node_all))
print("數據內容:", node_all)
print("節點名稱:", [i.tag for i in node_all])# 8.2.5 獲取子節點(直接子節點和子孫節點)
html_str = """
<div class="level_one on"><ul><li><a href="/index/index/view/id/1.html" title="什么是 Java" class="on">什么是 Java</a><a>Java</a></li><li><a href="javascript:" onclick="login(0)" title="Java 的版本">Java 的版本</a></li><li><a href="javascript:" onclick="login(0)" title="Java API 文檔"><a>a 節點中的 a 節點</a></a></li></ul>
</div>
"""
html = etree.HTML(html_str)
a_all = html.xpath("//li/a")
print("所有子節點 a:", a_all)
print("獲取指定 a 節點:", a_all[1])
a_txt = etree.tostring(a_all[1], encoding="utf-8")
print("獲取指定節點 HTML 代碼:", a_txt.decode('utf-8'))# 獲取子孫節點
a_all = html.xpath("//ul//a")
print("所有子節點 a:", a_all)
print("獲取指定 a 節點:", a_all[4])
a_txt = etree.tostring(a_all[4], encoding="utf-8")
print("獲取指定節點 HTML 代碼:", a_txt.decode('utf-8'))# 8.2.6 獲取父節點
html_str = """
<div class="level_one on"><ul><li><a href="/index/index/view/id/1.html" title="什么是 Java" class="on">什么是 Java</a></li><li><a href="javascript:" onclick="login(0)" title="Java 的版本">Java 的版本</a></li></ul>
</div>
"""
html = etree.HTML(html_str)
a_all_parent = html.xpath("//a/..")
print("所有 a 的父節點:", a_all_parent)
print("獲取指定 a 的父節點:", a_all_parent[0])
a_txt = etree.tostring(a_all_parent[0], encoding="utf-8")
print("獲取指定節點 HTML 代碼:\n", a_txt.decode('utf-8'))# 8.2.7 獲取文本
html_str = """
<div class="level_one on"><ul><li><a href="/index/index/view/id/1.html" title="什么是 Java" class="on">什么是 Java</a></li><li><a href="javascript:" onclick="login(0)" title="Java 的版本">Java 的版本</a></li></ul>
</div>
"""
html = etree.HTML(html_str)
a_text = html.xpath("//a/text()")
print("所有 a 節點中文本信息:", a_text)# 8.2.8 屬性匹配
html_str = """
<div class="video scroll"><div class="level">什么是 Java</div><div class="level">Java 的版本</div>
</div>
"""
html = etree.HTML(html_str)
div_one = html.xpath("//div[@class='level']/text()")
print(div_one)# 多屬性匹配
html_str = """
<div class="video_scroll"><div class="level" id="one">什么是 Java</div><div class="level">Java 的版本</div>
</div>
"""
html = etree.HTML(html_str)
div_all = html.xpath("//div[@class='level' and @id='one']/text()")
print(div_all)# 8.2.9 獲取屬性
html_str = """
<div class="video scroll"><li class="level" id="one">什么是 Java</li>
</div>
"""
html = etree.HTML(html_str)
li_class = html.xpath("//div/li/@class")
li_id = html.xpath("//div/li/@id")
print("class 屬性值:", li_class)
print("id 屬性值:", li_id)# 8.2.10 按序獲取屬性值
html_str = """
<div class="video_scroll"><li><a href="javascript:" onclick="login(0)" title="Java API 文檔">Java API 文檔</a></li><li><a href="javascript:" onclick="login(0)" title="JDK 的下載">JDK 的下載</a></li><li><a href="javascript:" onclick="login(0)" title="JDK 的安裝">JDK 的安裝</a></li><li><a href="javascript:" onclick="login(0)" title="配置 JDK">配置 JDK</a></li>
</div>
"""
html = etree.HTML(html_str)
li_all = html.xpath("//div/li/a/@title")
print("所有屬性值:", li_all)
li_first = html.xpath("//div/li[1]/a/@title")
print("第一個屬性值:", li_first)
li_four = html.xpath("//div/li[4]/a/@title")
print("第四個屬性值:", li_four)# 使用節點軸獲取節點內容(示例為獲取 li[2] 所有祖先節點)
html_str = """
<div class="video_scroll"><li><a href="javascript:" onclick="login(0)" title="Java API 文檔">Java API 文檔</a></li><li><a href="javascript:" onclick="login(0)" title="JDK 的下載">JDK 的下載</a></li><li><a href="javascript:" onclick="login(0)" title="JDK 的安裝">JDK 的安裝</a></li>
</div>
"""
html = etree.HTML(html_str)
ancestors = html.xpath("//li[2]/ancestor::*")
print("li[2] 所有祖先節點名稱:", [i.tag for i in ancestors])# 爬取豆瓣電影 Top250 中的電影信息(部分代碼)
from lxml import etree
import time
import random
import requests
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; wow64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}def processing(strs):s = ""for n in strs:s = s + "".join(n.split())return sdef get_movie_info(url):response = requests.get(url, headers=header)html = etree.HTML(response.text)div_all = html.xpath("//div[@class='info']")for div in div_all:names = div.xpath("./div[@class='hd']/a//span/text()")name = processing(names)infos = div.xpath("./div[@class='bd']/p/text()")info = processing(infos)score = div.xpath("./div[@class='bd']/div/span[2]/text()")evaluation = div.xpath("./div[@class='bd']/div/span[4]/text()")summary = div.xpath("./div[@class='bd']/p[@class='quote']/span/text()")print("電影名稱:", name)print("導演與演員:", info)print("電影評分:", score)print("評價人數:", evaluation)print("電影總結:", summary)print("- -分隔線- -")if __name__ == "__main__":for i in range(0, 250, 25):url = "https://movie.douban.com/top250?start={page}&filter=".format(page=i)get_movie_info(url)time.sleep(random.randint(1, 3))

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

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

相關文章

深入理解PHP中的生成器(Generators)

創建一個生成器非常簡單。你只需要像定義普通函數一樣定義它&#xff0c;但是使用yield關鍵字來產出值。例如&#xff0c;以下是一個簡單的斐波那契數列生成器&#xff1a; function fibonacci() {$num1 0;$num2 1;while (true) {yield $num1;$temp $num1 $num2;$num1 $n…

ubuntu 系統 pgm圖片和png相互轉化

ubuntu 系統 pgm圖片和png相互轉化。 安裝轉化工具&#xff1a; sudo apt-get install imagemagick pgm轉為png指令如下: convert input.pgm output.png png轉為pgm指令如下: convert input.png output.pgm

leetcode:98. 驗證二叉搜索樹

學習要點 加深純遞歸算法的理解 題目鏈接 98. 驗證二叉搜索樹 - 力扣&#xff08;LeetCode&#xff09; 題目描述 解法&#xff1a;純遞歸 vector<int> v;void dfs(TreeNode* root){if(root nullptr){return;}dfs(root->left);v.push_back(root->val);dfs(root…

如何確定IP的缺省子網掩碼是多少?

IP地址 201.100.200.1 的缺省子網掩碼由其 IP地址類別 決定。以下是判斷步驟&#xff1a; 1. 確定IP地址類別 IPv4地址分為 A、B、C、D、E 五類&#xff0c;根據第一個字節&#xff08;前8位&#xff09;的范圍劃分&#xff1a; A類&#xff1a;1.0.0.0 ~ 126.255.255.255&am…

Vue.js 粒子連線動畫組件 - FlyingLines

Vue.js 粒子連線動畫組件 - FlyingLines 使用指南 &#x1f31f; 簡介 FlyingLines 是一個基于 Vue.js 的炫酷粒子連線動畫組件&#xff0c;可以為您的網站添加動態的背景效果。該組件具有以下特點&#xff1a; ? 流暢動畫&#xff1a;基于 Canvas 的高性能渲染&#x1f5b…

無人機交互控制技術要點

一、技術要點 1. 物理交互設計 仿生柔性形態學&#xff1a;采用梯度剛度復合材料&#xff08;如硅膠-碳纖維&#xff09;設計柔性抓取器&#xff0c;模仿鳥類爪部結構&#xff0c;實現被動碰撞抑制與動態力生成&#xff0c;支持高速交互&#xff08;>3 m/s&#xff09;和…

qt集成openssl

第一&#xff1a;下載項目中對應版本的openssl的庫 https://openssl-library.org/source/old/1.0.2/ 老版本的openssl的下載地址&#xff0c;這個下載的好像是源碼&#xff0c;還要編譯。 https://indy.fulgan.com/SSL/ 在這里下載不需要編譯&#xff0c;下載下來直接用dll文件…

【鴻蒙HarmonyOS Next App實戰開發】??ArkUI時鐘界面實現解析:動態雙模式時鐘與沉浸式體驗?

在鴻蒙next系統上&#xff0c;通過ArkTS寫了個時鐘顯示頁面&#xff0c;集成在【圖影工具箱】應用中&#xff0c;應用商店可以下載使用。 這個頁面實現起來比較簡單&#xff0c;就是左邊一個模擬時鐘&#xff0c;右邊一個數字時鐘&#xff08;包含時間和日期的文字&#xff09…

ios簽名錯誤的解決辦法

另一種最常見的解決方案。在終端中運行以下命令。您應該添加自己的鑰匙串名稱和密碼。security lock-keychain temp.keychainsecurity unlock-keychain -pp ssw0rd temp.keychain在這種情況下&#xff0c;使用鑰匙串名稱為“temp”&#xff0c;其密碼為“p ssw0rd”。此外&am…

C#讀取OPCUA節點數據

本人第一次接觸OPCUA&#xff0c;如有不對的地方望指正&#xff0c;獲取的是公司的OPCUA服務器的數據 方式一&#xff1a; 測試環境: window11 vs2022 OPCFoundation.NetStandard.Opc.Ua .net framework 4.8 (2025-06-23 經過測試&#xff0c;.net8也可以使用這套.net …

OpenCV計算機視覺實戰(11)——邊緣檢測詳解

OpenCV計算機視覺實戰&#xff08;11&#xff09;——邊緣檢測詳解 0. 前言1. Sobel 算子與方向梯度1.1 Sobel 算子簡介1.2 實現過程 2. Laplacian 邊緣檢測2.1 Laplacian 算子簡介2.2 實現過程 3. Canny 算法3.1 Canny 算法簡介3.2 實現過程 小結系列鏈接 0. 前言 邊緣檢測能…

哈爾濱idc服務器租用-青蛙云

在數字化浪潮洶涌的當下&#xff0c;企業對于服務器的需求愈發強烈。哈爾濱作為東北地區重要的經濟文化中心&#xff0c;其 IDC 服務器租用市場也呈現出蓬勃發展的態勢。眾多企業在尋求 IDC 服務器租用時&#xff0c;青蛙云憑借自身顯著優勢脫穎而出&#xff0c;成為眾多用戶的…

Zephyr 系統深入解析:SoC 支持包結構與中斷調度器調優實踐

本文將全面深入講解 Zephyr RTOS 的 SoC 支持包設計架構&#xff08;SoC Series / SoC Variant&#xff09;、中斷系統實現、調度器原理、時間片與優先級調優技巧&#xff0c;以及如何在實際項目中構建自定義 SoC 支持包、實現高效的調度器策略和系統性能優化。全文超過 5000 字…

FPGA基礎 -- Verilog 結構建模之模塊參數值

Verilog 中模塊參數值&#xff08;parameter&#xff09;的使用&#xff0c;這是結構建模和模塊可配置設計的核心機制&#xff0c;廣泛應用于 總線寬度配置、流水線級數、功能開關、模塊復用 等場景。 一、什么是模塊參數值&#xff08;parameter&#xff09; parameter 是 Ver…

Skrill是什么?中國用戶能用嗎?安全嗎?完整指南

什么是Skrill&#xff1f; Skrill 前身為 Moneybookers&#xff0c;成立于 2001 年&#xff0c;總部位于英國倫敦&#xff0c;目前隸屬于 Paysafe 集團。作為一個多功能電子支付平臺&#xff0c;Skrill 支持全球 100 多個國家和地區、40 多種貨幣&#xff0c;被廣泛用于&#…

java+vue+SpringBoo校園部門資料管理系統(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.…

Java中的Map實現類詳解

Java中的Map實現類詳解 Java集合框架提供了多種Map接口的實現&#xff0c;每種實現都有其特定的使用場景和特點。以下是主要的Map實現類及其特性分析&#xff1a; 1. 通用Map實現 HashMap 特點&#xff1a;基于哈希表的實現&#xff0c;允許null鍵和null值線程安全&#xf…

Pytorch Lightning 進階 1 - 梯度檢查點(Gradient Checkpointing)

梯度檢查點&#xff08;Gradient Checkpointing&#xff09;是一種在深度學習訓練中優化顯存使用的技術&#xff0c;尤其適用于處理大型模型&#xff08;如Transformer架構&#xff09;時顯存不足的情況。下面用簡單的例子解釋其工作原理和優缺點&#xff1a; 核心原理 深度學…

SpreadJS 迷你圖:數據趨勢可視化的利器

引言 在數據處理和分析領域&#xff0c;直觀地展示數據趨勢對于理解數據和做出決策至關重要。迷你圖作為一種簡潔而有效的數據可視化方式&#xff0c;在顯示數據趨勢方面發揮著重要作用&#xff0c;尤其在與他人共享數據時&#xff0c;能夠快速傳達關鍵信息。SpreadJS 作為一款…

GESP2024年12月認證C++一級( 第三部分編程題(1)溫度轉換)

參考程序1&#xff1a; #include <cstdio> using namespace std;int main() {double K;scanf("%lf", &K);double C K - 273.15; //轉換為攝氏溫度 double F 32 C * 1.8; //轉換為華氏溫度 if (F > 212) //條件判斷 print…