数据分析和可视化: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.tpcf.cn/bicheng/86129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…