详细分析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 etree

def main():
    # 读取XML文件
    with open('books.xml', 'r') as file:
        xml_data = file.read()

    # 解析XML
    root = 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 etree

html = '''
<!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)

结果输出如下:

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

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

相关文章

torchvision中的数据集使用

torchvision中的数据集使用 使用和下载CIFAR10数据集 输出测试集中的第一个元素&#xff08;输出img信息和target&#xff09; 查看分类classes 打断点–>右键Debug–>找到classes 代码 import torchvisiontrain_set torchvision.datasets.CIFAR10(root"./data…

数据结构|排序总结(1)|直接插入排序

排序分类 插入排序&#xff1a;直接插入排序&#xff0c;希尔排序 选择排序&#xff1a;选择排序&#xff0c;堆排序 交换排序&#xff1a;冒泡排序&#xff0c;快速排序 归并排序 插入排序 直接插入排序 相当于摸牌&#xff0c;例如我们现在手上有{2&#xff0c;4&#xff0…

基于单片机光伏太阳能跟踪系统设计

**单片机设计介绍&#xff0c;基于单片机光伏太阳能跟踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机光伏太阳能跟踪系统的设计&#xff0c;旨在通过单片机技术实现对光伏太阳能设备的自动跟踪&#xff0c;以提高太阳…

前后端开发之——文章分类管理

原文地址&#xff1a;前后端开发之——文章分类管理 - Pleasure的博客 下面是正文内容&#xff1a; 前言 上回书说到 文章管理系统之添加文章分类。就是通过点击“新建文章分类”按钮从而在服务端数据库中增加一个文章分类。 对于文章分类这个对象&#xff0c;增删改查属于配…

k8s 持久化存储解析:hostPath与NFS的应用与探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s为什么要有持久化存储 2、NFS简介…

post请求搜索功能爬虫

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>…

基于单片机干湿垃圾自动分类系统

**单片机设计介绍&#xff0c;基于单片机干湿垃圾自动分类系统 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的干湿垃圾自动分类系统是一个集成传感器技术、机械控制和单片机编程于一体的自动化解决方案。该系统的主要目标是实…

归并排序和计数排序

计数排序 计数排序是一种非比较排序。 count_sort 还会用到相对大小。 节省空间。 前提是遍历数组找到max和min 从而进一步确定range。 然后将数在数组中的相对位置&#xff0b;min对其进行输出。 void count_sort(int* a, int n) {int max a[0], min a[0],cnt0;for …

漂亮的个人主页HTML源码

漂亮的个人主页HTML源码&#xff0c;页面简约&#xff0c;一个卡片式的风格介绍&#xff0c;喜欢的朋友们可以拿去研究 源码下载 漂亮的个人主页HTML源码

TCP挥手中TIME_WAIT存在的原因

四次挥手的一般过程如图所示&#xff1a; 在客户端收到FIN结束报文的时候不是立刻进入CLOSED状态&#xff0c;而是进入TIME_WAIT状态&#xff0c;一般等2MLS后进入关闭状态。 原因&#xff1a; 1.可靠地终止 TCP 连接。 2.保证让迟来的 TCP报文段有足够的时间被识别并丢弃。 …

【CSDN云VS腾讯云】要不然怎么说CSDN开发云是打工人和学生党的福音呢?

&#x1f341;作者简介&#xff1a;&#x1f3c5;云计算领域优质创作者&#x1f3c5;新星计划第三季python赛道TOP1&#x1f3c5; 阿里云ACE认证高级工程师&#x1f3c5; ✒️个人主页&#xff1a;小鹏linux &#x1f48a;个人社区&#xff1a;小鹏linux&#xff08;个人社区&a…

Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo

概述 本文探讨 Wails 框架的使用&#xff0c;从搭建环境到开发&#xff0c;再到最终的构建打包&#xff0c;本项目源码 GitHub 地址&#xff1a;https://github.com/mazeyqian/go-run-wechat-demo 前言 Wails 是一个跨平台桌面应用开发框架&#xff0c;他允许开发者利用 Go …

ElasticSearch分词检索

1. 倒排索引&#xff1a;表示一种数据结构&#xff0c;分词词条与文档id集合的隐射关系 2. 它跟关系型数据库是一种互补的关系&#xff0c;因为关系型数据库支持事务操作&#xff0c;满足ACID原则 #ik分词器下载 https://github.com/infinilabs/analysis-ik/releases POST /_a…

前端学习之DOM编程-案例div移动

这个案例是当你的鼠标按压下去后&#xff0c;div跟着你的鼠标移动而移动&#xff0c;当你的鼠标抬起后&#xff0c;div不随着鼠标移动而移动。类似于电脑移动应用图标的感觉。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

《Java面试自救指南》(专题四)Java基础

文章目录 有序集合有哪些?线程安全的集合有哪些&#xff1f;HashMap底层原理ConcurrentHashMap的底层数据结构ArrayList底层原理&#xff0c;ArrayList和Vector/LinkedList的区别String&#xff0c;StringBuffer&#xff0c;StringBuilder的区别 扩展&#xff1a;String不可变…

【THM】Exploit Vulnerabilities(利用漏洞)-

介绍 在这个房间里,我们将讨论一些识别漏洞的方法,并结合我们的研究技能来了解这些漏洞是如何被滥用的。 此外,您还会发现一些公开可用的资源,这些资源是您在执行漏洞研究和利用时的技能和工具的重要补充。然后,您将在房间的最后将所有这些应用到实际挑战中。 自动化与…

2021-2023年全国地表水水质监测数据集

1.监测范围 国家地表水水质自动监测网水质自动监测站。 2.监测项目监测项目为国家水质自动监测站配备的监测指标&#xff0c;主要包括五参数(水温、pH、溶解氧、电导率和浊度)、氨氮、高锰酸盐指数、总氮、总磷&#xff0c;部分水站增测总有机碳、叶绿素a、藻密度、VOCs、生物…

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:…

Python爬取公众号封面图(零基础也能看懂)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

#{} 和 ${}区别

1、参数是Integer类型时候没区别&#xff08;#是预编译SQL&#xff0c;$是即时SQL&#xff09; 2、当参数是String类型时&#xff0c;就会出错了 &#xff08;1&#xff09;这是$的报错信息&#xff0c;因为我们的参数admin并没有加引号所以不满足字符串条件 (2)正确的SQL &am…