5.网络爬虫——Xpath解析

news/2024/5/20 4:45:33/文章来源:https://blog.csdn.net/weixin_50804299/article/details/129714988

网络爬虫——Xpath解析

    • Xpath简介
    • Xpath解析
      • 节点选择
      • 路径表达式
      • 谓语
      • 未知节点
    • Xpath实战演示
      • 豆果美食实战
      • 获取数据
      • 源代码

前言:
📝​📝​此专栏文章是专门针对Python零基础爬虫,欢迎免费订阅!
📝​📝第一篇文章获得全站热搜第一python领域热搜第一
第四篇文章全站热搜第八,欢迎阅读!
🎈🎈欢迎大家一起学习,一起成长!!
💕💕:悲索之人烈焰加身,堕落者不可饶恕。永恒燃烧的羽翼,带我脱离凡间的沉沦。在这里插入图片描述

在这里插入图片描述

Xpath简介

XPath是一种用于在XML文档中定位节点的语言,它可以用于从XML文档中提取数据,以及在XML文档中进行搜索和过滤操作。它是W3C标准的一部分,被广泛应用于XML文档的处理和分析。

XPath使用路径表达式来描述节点的位置,这些路径表达式类似于文件系统中的路径。路径表达式由一个或多个步骤(step)组成,每个步骤描述了一个节点或一组节点。步骤可以使用关系运算符(如/和//)来连接,以便描述更复杂的节点位置。

XPath还提供了一些内置函数和运算符,可以对XML文档中的数据进行操作和计算。例如,可以使用XPath的数学函数来计算节点的数值,或使用字符串函数来处理节点的文本内容。

在Python中,XPath可以使用lxml库来实现。lxml提供了一个etree模块,该模块包含了XPath的实现,可以方便地对XML文档进行解析和操作,同时支持XPath语法

Xpath解析

节点选择

XPath用于在XML文档中定位和选择节点,以下是XPath的一些常用用法:
在这里插入图片描述

1. 选择所有节点:

使用双斜杠//选择文档中的所有节点,例如://node()

2. 按标签名选择节点:

使用标签名选择节点,例如://book

3. 按属性选择节点:

使用方括号[]和@符号选择具有特定属性值的节点,例如://book[@category="children"]

4. 选择父节点、子节点和兄弟节点:

使用父节点(…)、子节点(/)和兄弟节点(//)选择节点,例如://book/title/..//book/author/following-sibling::title

5. 使用通配符选择节点:

使用星号*选择任何节点,例如://book/*选择所有book节点的子节点

6. 使用逻辑运算符选择节点:

使用and、or、not等逻辑运算符选择节点,例如://book[price<10 and @category="children"]

7. 使用内置函数处理节点:

使用内置函数处理节点的文本和数值,例如://book[substring(title,1,3)="The"]选择标题以"The"开头的书籍

8. 使用轴选择节点:

使用轴选择节点,例如://book/ancestor::library选择book节点的library祖先节点

在Python中,使用lxml库的etree模块可以方便地使用XPath进行节点定位和选择。例如,可以使用etree.parse()函数解析XML文档,并使用xpath()方法执行XPath表达式,以便选择和操作XML文档中的节点。

路径表达式

在这里插入图片描述

XPath路径表达式是一种用于在XML文档中定位节点的语法。它由一系列节点名、轴、谓词和运算符组成,可以构造出一个完整的路径,以定位到目标节点。

XPath路径表达式的基本语法如下:

/          : 从根节点开始,定位到目标节点
//         : 从当前节点开始,递归查找所有符合条件的节点
.          : 表示当前节点
..         : 表示当前节点的父节点
*          : 匹配任意节点
@          : 表示属性节点
[]         : 表示谓词,用于筛选符合条件的节点

例如,以下是一些XPath路径表达式的示例:

/                 : 定位到根节点
/bookstore        : 定位到根节点下的bookstore节点
/bookstore/book   : 定位到bookstore节点下的所有book节点
//book            : 递归查找所有book节点
//book[@category='web'] : 查找所有category属性值为web的book节点

XPath路径表达式是XPath语言的核心,它可以用于查询XML文档中的数据,并且在XPath语言中还有很多其他的功能,例如函数、运算符等,可以更加灵活地处理XML数据。

谓语

XPath谓语是一种用于筛选XML文档中特定节点的表达式,它可以在XPath路径中使用。谓语通常由方括号包围,并包括一个条件表达式。

例如,以下XPath路径选择所有名为“book”的元素:

/bookstore/book

如果我们想要选择所有具有价格大于10美元的书籍,我们可以使用以下XPath路径和谓语:

/bookstore/book[price > 10]

在这个例子中,谓语是“[price > 10]”,它指定了一个条件,它只选择价格大于10美元的书籍。

在这里插入图片描述

未知节点

当我们需要选择一个未知节点时,意味着我们无法确定节点的位置或名称,但我们知道节点具有某些特定属性或特征。在这种情况下,我们可以使用通配符、轴、谓词等技术来选择未知节点。

通配符(*)可以用来匹配任何节点,轴可以用来选择与当前节点相关的节点,谓词可以用来筛选符合条件的节点。使用这些技术,我们可以选择任何未知节点,使我们的XPath表达式更加灵活和通用。

在这里插入图片描述

Xpath语法较多,我不一一演示,但在后面实战演示中,会依次讲解,帮助大家理解学习。理论讲解完毕,我们进入实战!!! 💨💨

Xpath实战演示

所以今天实战内容是关于美食的,毕竟博主是一个吃货 。🍧 🍨 🍩 🍪 🎂 🍰🧀 🍖 🍗 🥩 🥓 🍔 🍟 🍕 🌭 🥪 🌮 🌯 🍜 🍝 🍠 🍢 🍣

豆果美食实战

让我们欣赏一下主页吧!

在这里插入图片描述

我们今天不获取照片了,毕竟太吸引人了,哈哈哈。

在这里插入图片描述
>和之前一样,我们点击右键,选择检查,查看元素,接着按CTRL+F键
在这里插入图片描述

在XPath中,nodename指的是XML文档中的节点名称。节点名称可以是元素名称、属性名称、注释名称、处理指令名称等。
在这里插入图片描述
在这里插入图片描述

第一个是不是很简单,想找那个就输入那个,我们慢慢来。
/从根节点选取(取子节点)。在这里插入图片描述

url = 'https://www.douguo.com/'res = requests.get(url)print(res.text)
html = etree.HTML(res.text)
# /从根节点选取(取子节点)。
rest = html.xpath('/html/head/title')  # 返回Element对象
print(rest)

在这里插入图片描述

url = 'https://www.douguo.com/'res = requests.get(url)print(res.text)
html = etree.HTML(res.text)
# /从根节点选取(取子节点)。
rest = html.xpath('/html/head/title/text()')  # 返回Element对象
print(rest)

我们在xpath代码里面加入text(),/text() 获取Element对象的元素内容(元素文本)

在这里插入图片描述

// 获取任何位置的数据,不从根路径出发

# // 获取任何位置的数据,不从根路径出发
title_text = html.xpath('//title/text()')  # 一般会获取多个数据
print(title_text)

在这里插入图片描述

/@属性名 获取标签中的属性名的内容

# /@属性名  获取标签中的属性名的内容
attr = html.xpath('//meta/@name')
print(attr)

在这里插入图片描述

谓语 (相当于python里面的索引,条件) 选取数据中某部分数据


# 谓语 (相当于python里面的索引,条件)
# 选取数据中某部分数据
index = html.xpath('/html/head/meta[3]')  # meta[3] 获取meta里面的第3个参数
print(index)

在这里插入图片描述

last() 获取最后面的数据

# last() 获取最后面的数据index = html.xpath('/html/body/div[1]/div/a[last()]')  # meta[3] 获取meta里面的第3个参数
print(index)

在这里插入图片描述

position()<3 获取索引小于3的数据

# position()<3  获取索引小于3的数据
index = html.xpath('/html/body/div[1]/div/a[position()<3]')  # meta[3] 获取meta里面的第3个参数
print(index)

在这里插入图片描述

//meta[@charset] 根据标签名 和 属性名称进行数据筛选

# //meta[@charset]  根据标签名 和 属性名称进行数据筛选
index = html.xpath('//meta[@charset]')  # meta[3] 获取meta里面的第3个参数
print(index)

在这里插入图片描述

//meta[@name="meta1"] # 标签为meta 并且 里面的属性为name,属性的值为author

# //meta[@name="meta1"] # 标签为meta 并且 里面的属性为name,属性的值为author
index = html.xpath('//meta[@name="author"]')
print(index)

在这里插入图片描述

未知节点
不管是什么标签名 只要其中有class="meta1"就获取到


# 未知节点
index = html.xpath('//*[@class="item"]')
# 不管是什么标签名 只要其中有class="meta1"就获取到
print(index)

在这里插入图片描述

获取未知的属性
获取meta标签 并且里面有一个属性的值=keywords

# 获取未知的属性
# 获取meta标签 并且里面有一个属性的值=keywords
index = html.xpath('//meta[@*="keywords"]')
print(index)

在这里插入图片描述

获取数据

常用的用法基本上都讲了一遍,现在教大家怎么获取更多数据
在这里插入图片描述

我们来获取这些菜谱的名字和作者的名字
首先,我们获取这个网页的源代码到我们本地,这个就不具体演示了,前面几章已经作了详细的讲解,如果有疑问,可以看我之前的文章。

直接展示:

import time
import requests
from lxml import etree
from tabulate import tabulateurl = 'https://www.douguo.com/'res = requests.get(url)print(res.text)
# html = etree.HTML(res.text)

在这里插入图片描述

是不是很简单,几行代码就得到了这些数据,接下来我们对源代码里面的数据用Xpath进行解析,来获取我们想要的数据。

首先我们需要认识一行代码
html = etree.HTML(res.text)

这行代码的作用是将 HTTP 响应中的 HTML 文本解析为一个 Element 对象,以便后续对其进行操作,例如提取数据、修改内容、查找元素等等。其中,etree 是 Python 的一个第三方库,可以用来解析 XML 和 HTML 文本。HTML 是一种标记语言,用于构建网页和 Web 应用程序的用户界面。
我们在使用的时候,需要导入,代码如下:
from lxml import etree

进入正题,开始使用Xpath来解析数据:

html = etree.HTML(res.text)
name = html.xpath(f'//*[@id="content"]/ul[1]/li[1]/div/a/text()')
print(name)

在这里插入图片描述

很好,我们通过一行代码获取了第一个美食的名字,一共有八个美食,我们不可能写八行代码来获取名字吧,虽然可以,但太繁琐,不宜使用。我们可以使用循环,他们之间一定有内在的联系,通过解析发现,他们路径基本上相同,不同的li[i]里面的值,我们通过循环来获取名字。
在这里插入图片描述

修改后的代码,三行就够了!!

html = etree.HTML(res.text)
for i in range(1, 9):name = html.xpath(f'//*[@id="content"]/ul[1]/li[{i}]/div/a/text()')
# name1 = html.xpath(f'//*[@id="content"]/ul[1]/li[2]/div/a/text()')
# name2 = html.xpath(f'//*[@id="content"]/ul[1]/li[3]/div/a/text()')print(name)
# print(name1)
# print(name2)

在这里插入图片描述

我们获取了前八个美食的名字,接下来我们获取前八个美食的作者名字,方法和前面一样,先找到一个作者的xpath路径,接着找规律,如何用循环写出来,如下:


res = requests.get(url)# print(res.text)
html = etree.HTML(res.text)
for i in range(1, 9):name = html.xpath(f'//*[@id="content"]/ul[1]/li[{i}]/div/a/text()')author = html.xpath(f'//*[@id="content"]/ul[1]/li[{i}]/div/p/a[1]/text()')print(name)print( author)

在这里插入图片描述

我们获取了想要的数据l,是不是很简单,其实我们还可以美化一下。

    result = tabulate([[name, author]], headers=['Name', 'Author'], tablefmt='orgtbl')print(result)

将名字和作者的数据以表格的形式输出。具体实现方式是使用tabulate库中的tabulate函数,将数据列表和表头传入函数中,设置输出格式为orgtbl,最后将输出结果打印出来。
在这里插入图片描述

源代码

import time
import requests
from lxml import etree
from tabulate import tabulateurl = 'https://www.douguo.com/'res = requests.get(url)# print(res.text)
html = etree.HTML(res.text)
for i in range(1, 9):name = html.xpath(f'//*[@id="content"]/ul[1]/li[{i}]/div/a/text()')author = html.xpath(f'//*[@id="content"]/ul[1]/li[{i}]/div/p/a[1]/text()')print(name)print(author)result = tabulate([[name, author]], headers=['Name', 'Author'], tablefmt='orgtbl')print(result)

🍀🍀写在最后:本篇文章总计上万字,感谢你能阅读到这里,为你的学习点一个赞。为了写好这篇文章,我学习了三天的数据解析,写了四个小时的文章,一点一点的写出来,方便大家理解学习,如果觉得对你有帮助,点一个赞吧,你的赞是对我最大的鼓励,谢谢啦。🌸🌸🌸

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_274738.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python绘制论文曲线图

1、折线图 plt.plot() 常用的一些参数&#xff1a; 颜色&#xff08;color)&#xff1a; ‘c’ 青红&#xff08;cyan&#xff09; ‘r’ 红色&#xff08;red&#xff09; ‘m’ 品红&#xff08;magente&#xff09; ‘g’ 绿色&#xff08;green&#xff09; ‘y’ 黄色…

什么平台制作表单工具效率高?

目前&#xff0c;低代码开发平台在很多行业中得到了应用和推广。如果需要制作表单工具&#xff0c;还依然用传统的表单工具来制作表单&#xff0c;效率不仅得不到提升&#xff0c;而且办公自动化发展步伐也将缓慢发展。那么&#xff0c;借助什么样的平台可以让制作表单工具更高…

OpenHarmony开发一个App,安装到BearPi-HM Micro开发板

一、前言 建议先阅读我们这篇 OpenHarmony 快速上手 BearPi-HM Micro 一个带显示屏的开发板,这里面详细介绍了Micro开发板如何进行源码编译烧录,以及hap包安装的全过程。 本篇是介绍如何开发一个App,然后安装到BearPi-HM Micro开发板上。 有同学会问,这不是有手就行了吗?…

基于YOLOv5的停车位检测系统(清新UI+深度学习+训练数据集)

摘要&#xff1a;基于YOLOv5的停车位检测系统用于露天停车场车位检测&#xff0c;应用深度学习技术检测停车位是否占用&#xff0c;以辅助停车场对车位进行智能化管理。在介绍算法原理的同时&#xff0c;给出Python的实现代码、训练数据集以及PyQt的UI界面。博文提供了完整的Py…

xss-labs靶场分析及绕过

level1源码&#xff1a;图中框示的为注入点&#xff0c;下同payloadname<script>alert(1)</script>注入结果&#xff1a;原理&#xff1a;由于第一关没有做任何的过滤所以直接注入就行level2源码&#xff1a;payload&#xff1a;keyworda"><script>a…

Vue3学习笔记(1.0)

Vue.js是一套构建用户界面的渐进式框架。 Vue只关注视图层&#xff0c;采用自底向上增量开发的设计。 Vue的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件。 <div id"hello-world" class"demo"> {{message}} </div><scr…

Spring WebSocket入门实例、源码解读、STOMP客户端

1 Spring WebSocket入门实例 在浏览器和服务器之间,使用WebSocket发送和接收消息。具体会使用到WebSocket子协议STOMP。 1.1 创建Spring Boot项目,添加WebSocket依赖 后端Spring Boot的WebSocket依赖,前端使用Thymeleaf,所以需要webjars依赖。 pom.xml如下: <!-- 后端W…

buu刷题(4)

目录 [HFCTF2020]BabyUpload [XNUCA2019Qualifier]EasyPHP .htaccess包含文件 第一种方法 第二种方法 [GWCTF 2019]你的名字 [EIS 2019]EzPOP [2020 新春红包题]1 如何绕过后缀名呢 方法一 还有一点就是json格式的数据会被执行吗&#xff0c;实践试试 构造一下试试&am…

【kubernetes云原生】k8s标签选择器使用详解

目录 一、标签选择器来源 二、什么是标签选择器 2.1 标签选择器概述 2.2 标签选择器概述属性 三、标签使用场景 四、标签选择器特点 4.1 基本特点 4.2 核心标签选择器 4.3 补充说明 五、标签选择器常用操作命令 5.1 前置准备 5.2 常用操作命令 5.2.1 查看namespac…

git与gitee结合使用,提交代码,文件到远程仓库

git与gitee结合使用&#xff0c;如何提交文件到远程仓库&#xff0c;以及如何克隆仓库的内容到本地1.安装git1.1 git 安装以后&#xff0c;cmd git --version 说 git 不存在&#xff0c;问题的解决2.配置ssh公钥和创建配置gitee仓库2.1 配置ssh公钥2.2 创建并配置gitee仓库3. 小…

蓝桥杯训练day3

day31.递推&#xff08;1&#xff09;3777. 砖块&#xff08;2&#xff09;95. 费解的开关&#xff08;3&#xff09;1208. 翻硬币2.递归&#xff08;1&#xff09;1497. 树的遍历&#xff08;2&#xff09;97. 约数之和1.递推 &#xff08;1&#xff09;3777. 砖块 思路&…

纯干货:分享一些跨境电商客服经常会用到的话术(含中英文)

纯干货&#xff1a;分享一些跨境电商客服经常会用到的话术&#xff08;含中英文&#xff09;跨境电商同国内的电商平台一样&#xff0c;是将国内的产品卖到国外去赚取信息差&#xff0c;只不过客服面对的是国外的客户&#xff0c;仍旧需要为客户解决一系列服务问题。让前来咨询…

go_admin开源项目笔记

git clone 到本地 然后进入到 go-admin 根目录 执行 &#xff1a;go build 报错如下&#xff1a; 拿第一个详细解读&#xff1a; common\middleware\sentinel.go:4:2: missing go.sum entry for module providing package github.com/alibaba/sentinel-golang/core/system (im…

41.解构赋值

目录 1 数组解构 1.1 基本用法 1.2 交换值 1.3 数组排序 1.4 多解构多余的会变为undefined 1.5 少的就按顺序来 1.6 解构其余的值 1.7 默认解构值 1.8 跳过一些值 1.9 支持多维数组 2 对象解构 2.1 基本用法 2.2 数组套对象 2.3 多级对象 2.4 数…

ideal导入Spring源码详解

前言 踩过很多坑&#xff0c;参考过很多博客&#xff0c;在不懈的坚持下终于迈进了spring源码的门槛 1、环境配置 本博客使用的是 ideal2020.3gradle-6.4.1spring-framework-5.1.xjdk8 1.1安装和配置gradle 1.1.1下载gradle 下载链接 我使用的是gradle-6.4.1-bin.zip这个…

win下pytorch安装—cuda11.7 + cudnn8.4 + pytorch1.13 + tensorRT

安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch安装四、tensorRT8.X安装写在前面 博主这里装的是cuda11.7&#xff0c;最后一步tensorRT运行的时候有个pycuda的安装&#xff0c;它的最新版本只支持到cuda11.6&#xff0c;所以博主最后是又把cuda…

【UML】项目开发流程

以下模型是一个项目从启动到最终部署&#xff0c;逐步细化&#xff08;精化&#xff09;、实现的过程 1、业务用例模型 业务用例模型在项目启动阶段&#xff0c;使用业务用例模型来获取需求&#xff0c;是为了真是业务建立模型&#xff0c;为了和客户达成共识&#xff0c;暂不…

Android network — ipv6邻居发现协议

Android network — ipv6邻居发现协议0. 前言1. 地址解析1.1 IPv6地址解析过程分析&#xff1a;1.2 报文抓包分析&#xff1a;2. 跟踪邻居状态3. 重复地址检测3.1 抓包分析3.2 IPv6地址生命周期&#xff1a;4. 路由器发现4.1 地址自动配置&#xff1a;4.2 默认路由器优先级和路…

2023最好就业的8门编程语言出炉~

今天给大家分享 DevJobsScanner 不久前刚发布的「Top 8 Most Demanded Programming Languages in 2022」清单。 DevJobsScanner 在过去的14个月&#xff08;从2021年10月到2022年11月&#xff09;中分析了超过 1200 万个开发人员职位需求&#xff0c;并从其中挑选了明确需要编程…

程序员增加收入实战 让小伙伴们都加个鸡腿

文章目录前言1️⃣一、发外包平台&#x1f481;&#x1f3fb;‍♂️二、朋友介绍✍️三、打造自己的个人IP&#x1f44b;&#x1f3ff;四、混群拉单&#x1f933;&#x1f3ff;五、面试拉单&#x1f4bb;六、技术顾问&#x1f9b4;七、开发个人项目总结&#xff1a;前言 程序员…