详细分析Python爬虫中的xpath(附Demo)

目录

  • 前言
  • 1. 基本知识
  • 2. 常用API
  • 3. 简易Demo

前言

关于爬虫的基本知识推荐阅读:Python爬虫从入门到应用(超全讲解)

该知识点需要提前安装相关依赖:pip install lxml

1. 基本知识

XPath(XML Path Language)是一种用于在XML文档中定位和选择节点的语言

在XML文档中通过路径表达式(path expression)来定位节点,这些路径描述了节点在层次结构中的位置

一、节点

在XML文档中,所有的内容都以节点的形式存在

主要有两种类型的节点:

  • 元素节点(Element Nodes):代表XML文档中的元素,比如 <book><title>
  • 文本节点(Text Nodes):代表元素节点中的文本内容

二、路径表达式:(XPath使用路径表达式来选取节点或节点集。路径表达式可以基于节点名称、位置、属性等来定位节点)

常见的路径表达式包括:

  • /:从根节点开始选择节点
  • //:选取节点,不考虑它们的位置
  • .:选取当前节点
  • ..:选取当前节点的父节点
  • @:选取属性

三、轴(Axis):(轴定义了相对于当前节点的节点集)

常用的轴包括:

  • ancestor:选取所有祖先节点
  • child:选取所有子节点
  • parent:选取父节点
  • preceding-sibling:选取当前节点之前的所有同级节点
  • following-sibling:选取当前节点之后的所有同级节点

四、操作符:(支持一系列操作符,用于比较、计算和连接表达式)

包括算术运算符(+、-、*、div、mod)、关系运算符(=、!=、<、>、<=、>=)等

五、函数(Functions):(一系列内置函数,用于执行各种操作,如字符串处理、数值计算、节点操作等)

常见的函数包括 string()contains()、count()concat()

2. 常用API

  • xpath() 方法:根据XPath表达式选择节点或节点集合

  • text 属性:获取节点的文本内容

  • attrib 属性:获取节点的属性值

  • find() 方法:查找第一个匹配的节点

  • findall() 方法:查找所有匹配的节点

以下是方法示例:

from lxml import etree# XML字符串
xml_str = '''
<bookstore><book category="Fiction"><title lang="en">Harry Potter</title><author>J.K. Rowling</author><year>2005</year><price>29.99</price></book><book category="Non-Fiction"><title lang="en">The Elements of Style</title><author>William Strunk Jr.</author><year>1999</year><price>9.95</price></book>
</bookstore>
'''# 创建Element对象
root = etree.fromstring(xml_str)

以下为方法示例:

# xpath() 方法示例
titles = root.xpath('//title/text()')
print("Titles:")
for title in titles:print(title)

截图如下:

在这里插入图片描述

text属性 输出:First Book Title: Harry Potter

# text 属性示例
first_book_title = root.xpath('/bookstore/book[1]/title')[0].text
print("\nFirst Book Title:", first_book_title)

attrib属性 输出:First Book Category: Fiction

# attrib 属性示例
first_book_category = root.xpath('/bookstore/book[1]/@category')[0]
print("\nFirst Book Category:", first_book_category)

find方法 输出:First Non-Fiction Book Title: The Elements of Style

# find() 方法示例
first_non_fiction_book_title = root.find('.//book[@category="Non-Fiction"]/title')
print("\nFirst Non-Fiction Book Title:", first_non_fiction_book_title.text)

findall方法

# findall() 方法示例
all_authors = root.findall('.//author')
print("\nAll Authors:")
for author in all_authors:print(author.text)

截图如下:

在这里插入图片描述

3. 简易Demo

根据以上的API以及输出结果,可稍微了解一些知识

以下为简单的XML示例来演示XPath的使用

还是刚刚那个xml文档,不过弄成文件放置

from lxml import etreedef main():# 读取XML文件with open('books.xml', 'r') as file:xml_data = file.read()# 解析XMLroot = etree.fromstring(xml_data)# 使用XPath选择所有书籍的标题titles = root.xpath('/bookstore/book/title/text()')print("书籍标题:")for title in titles:print(title)# 使用XPath选择所有语言为英语的书籍标题english_titles = root.xpath('/bookstore/book/title[@lang="en"]/text()')print("\n语言为英语的书籍标题:")for title in english_titles:print(title)# 使用XPath选择所有价格低于10美元的书籍标题cheap_titles = root.xpath('/bookstore/book[price < 10]/title/text()')print("\n价格低于10美元的书籍标题:")for title in cheap_titles:print(title)if __name__ == "__main__":main()

截图如下:

在这里插入图片描述

注意我在上述Demo中都用到etree.fromstring(),但在其他文章又看到etree.HTML()

接下来阐述下这几个的差异:

etree.HTML()etree.parse()etree.fromstring()
解析HTML字符串,将传入的字符串解析为HTML文档,并构建相应的ElementTree对象解析本地文件或可读文件对象中的XML或HTML文档解析XML字符串,类似于etree.HTML()

对于这几个函数的选择:

  • 本地的HTML文件,可以使用etree.parse()函数来解析
  • HTML字符串,可以使用etree.HTML()函数来解析
  • 对于XML字符串,可以使用etree.fromstring()函数

再次举例一个html的例子:

from lxml import etreehtml = '''
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>测试</title>
</head>
<body><div class="container"><header><h1>欢迎来到我的网站</h1><nav><ul><li><a href="https://www.example.com/">首页</a></li><li><a href="https://www.example.com/about">关于我们</a></li><li><a href="https://www.example.com/contact">联系我们</a></li></ul></nav></header><section><h2>最新文章</h2><article><h3>文章标题1</h3><p>文章内容1</p></article><article><h3>文章标题2</h3><p>文章内容2</p></article></section><aside><h2>侧边栏</h2><ul><li>链接1</li><li>链接2</li><li>链接3</li></ul></aside><footer><p>版权所有 © 2024</p></footer></div>
</body>
</html>
'''# 解析HTML
root = etree.HTML(html)# 选择所有链接
links = root.xpath('//a')
print("所有链接:")
for link in links:print("文本:", link.text)print("URL:", link.attrib['href'])# 查找侧边栏中的链接
sidebar_links = root.xpath('//aside//li')
print("\n侧边栏链接:")
for link in sidebar_links:print("文本:", link.text)

结果输出如下:

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

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

相关文章

GIt 删除某个特定commit

目的 多次commit&#xff0c;想删掉中间的一个/一些commit 操作方法 一句话说明&#xff1a;利用rebase命令的d表示移除commit的功能&#xff0c;来移除特定的commit # 压缩这3次commit,head~3表示从最近1次commit开始&#xff0c;前3个commit git rebase -i head~3rebase…

机器学习每周挑战——信用卡申请用户数据分析

数据集的截图 # 字段 说明 # Ind_ID 客户ID # Gender 性别信息 # Car_owner 是否有车 # Propert_owner 是否有房产 # Children 子女数量 # Annual_income 年收入 # Type_Income 收入类型 # Education 教育程度 # Marital_status 婚姻状况 # Housing_type 居住…

使用GPT需要注意的事项

GPT出来之后&#xff0c;基本就告别浏览器搜索问题答案了。将问题原封不动的copy给GPT基本可以得到解答。 但是这个也有弊端&#xff0c;那就是太依赖GPT了。 1&#xff0c;使用GPT需要更强的专业知识&#xff1a;除了能问对问题&#xff0c;还要具备识别GPT&q…

拦截器抛出异常无法被全局异常处理器捕获问题

文章目录 基本说明问题描述问题原因解决方法前端执行的所有请求都通过Controller&#xff0c;而不是直接访问html定义一个/error路径的方法 总结 基本说明 我的前后端项目是放在一起的&#xff0c;前后端都是由springMVC进行控制&#xff0c;但是现在我在拦截器的preHandle方法…

蓝桥杯单元测试专项练习Java版(单元测试4)(修正版)

关于简单循环覆盖法可以看看这里我的上一个文章http://t.csdnimg.cn/k92fn\ 题目4链接:单元测试专项练习&#xff08;JavaPython&#xff09; - 第四题单元测试题目&#xff08;Java&#xff09; - 蓝桥云课 (lanqiao.cn) 目录 题目描述 源代码功能 原题: Datas.java Good…

自动驾驶_交通标志识别:各目标检测算法评测

自动驾驶|交通标志识别&#xff1a;各目标检测算法评测 论文题目&#xff1a;Evaluation of Deep Neural Networks for traffic sign detection systems 开源代码&#xff1a;https://github.com/aarcosg/traffic-sign-detection 附赠自动驾驶学习资料和量产经验&#xff1a;…

计算机视觉——基于傅里叶幅度谱文档倾斜度检测与校正

概述 在计算机视觉领域&#xff0c;处理文档数据时&#xff0c;OCR算法的性能往往会受到文档的倾斜度影响。如果文档在输入到模型之前没有经过恰当的校正&#xff0c;模型就无法期待模型能够提供准确的预测结果&#xff0c;或者模型预测的精度会降低。例如&#xff0c;在信息提…

助力蓝桥杯单片机省一————模块之超声波

距离蓝桥杯单片机省赛还有7天 本次介绍的模块是超声波模块&#xff0c;将使用定时器1和PCA进行距离的测量。如果对PCA还未了解的&#xff0c;可以打开官方给的芯片数据手册&#xff0c;自行查看。 一、超声波测量原理 二、产生8个40KHz的超声波 void Init_wave() {unsigned …

7 个 iMessage 恢复应用程序/软件可轻松恢复文本

由于误操作、iOS 升级中断、越狱失败、设备损坏等原因&#xff0c;您可能会丢失 iPhone/iPad 上的 iMessages。意外删除很大程度上增加了这种可能性。更糟糕的是&#xff0c;这种情况经常发生在 iDevice 缺乏备份的情况下。 &#xff08;iPhone消息消失还占用空间&#xff1f;&…

实际项目中如何使用Git做分支管理

前言 Git是一种强大的分布式版本控制系统&#xff0c;在实际项目开发中使用Git进行分支管理是非常常见的做法&#xff0c;因为它可以帮助团队高效的协作和管理项目的不同版本&#xff0c;今天我们来讲讲在实际项目中最常用的Git分支管理策略Git Flow。 常见的Git分支管理策略…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1&#xff09;git加入鼠标右键 2&#xff09;git clone源码 2、VSCode出场 1&#xff09;创建pyth…

第二十五周代码(蓝桥杯查缺补漏)

2024/03/31 周日 填充 题目链接 【参考代码】 想用暴力&#xff0c;没过 //枚举&#xff0c;未出结果QAQ #include <bits/stdc.h> using namespace std; string s00 "00"; string s11 "11"; int ans 0; //m个问号&#xff0c;子串有2^m…

1-32 异常

一 什么是异常? 1.含义:异与正常状态的显示,控制台显示的结果和预期的结果不一致 2.例如: int[] nums new int[2]; System.out.println(nums[2]); --抛出异常 二 异常分类 1.检测性异常:又称 非运行时异常,一般编写代码过程中编辑器直接报错 2.非检测性异常(常用):又称为…

牛客 2024春招冲刺题单 ONT98 牛牛猜节点【中等 斐波那契数列 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/6a3dfb5be4544381908529dc678ca6dd 思路 斐波那契数列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

让chatGPT控制物理设备

作为自动控制行业的工程师&#xff0c;我们也许最关心的是如何使chatGPT 控制物理设备。我发现许多人仍然停留在传统程序设计的思维阶段&#xff0c;比如让大模型编写一段PLC 代码&#xff0c;或者是生成一些信息模型。 其实大模型具备判断与思考的能力&#xff0c;AI …

ARM v8 Cortex R52内核 02 程序模型 Programmers Model

ARM v8 Cortex R52内核 02 程序模型 Programmers Model 2.1 关于程序模型 Cortex-R52处理器实现了Armv8-R架构。这包括&#xff1a; 所有的异常级别&#xff0c;EL0-EL2。 每个异常级别下的AArch32执行状态。 T32和A32指令集&#xff0c;其中包括&#xff1a; 浮点运算。 …

Day:004(2) | Python爬虫:高效数据抓取的编程技术(数据解析)

正则表达式实战-腾讯新闻 需求&#xff1a; 使用正则获取腾讯新闻标题内容 网站&#xff1a;https://sports.qq.com/ 代码&#xff1a; import reimport requests from fake_useragent import UserAgenturl https://sports.qq.com/ # 构建请求头信息 headers {User-Agent:…

【Frida】【Android】 工具篇:ProxyPin抓包详解

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

SSL VPN

1、SSL (Secure Sockets Layer)一种加密的通讯协定,用在使用者与网服器之间 【1】安全套接层 位于传输层和应用层之间,保护应用层的数据(HTTPS(443)=HTTP+TLS) 【2】版本 SSLv2 SSLv3 修改→TLS (Transport Layer Security)安全传输层协议,) 【3】模式 采用…

Linux文件种类、扩展名与目录配置详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 二、Linux文件种类 1、纯…