项目七:学会使用python爬虫解析库(小白大成级)

news2024/11/18 7:24:25

前期我们学会了怎么使用python爬虫请求库和解析库的简单应用和了解,同时能够对爬虫有一个较为清晰的体系,毕竟简单的爬虫基本上都是请求数据——解析数据——存储数据的大概流程。

那么回忆一下,请求库我们学的是requests模块,解析库学了是正则表达式和re模块。当然我们学习的技术不必拘泥,不必局限也不必自大。

目录

xpath基本介绍

简介

作用

语法规则

lxml基本介绍

简介

安装

作用

用法

案例


这一次我们就来学一下解析库的进阶功法——xpath和python中的lxml库

xpath基本介绍

简介

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

它被设计用来在这些文档的结构化数据中进行导航和搜索。XPath是W3C的标准,被广泛用于数据提取、配置文件的解析、网页自动化测试以及XML文档的变换和查询。

作用
  1. 数据提取:从XML或HTML文档中提取特定数据。
  2. 自动化测试:在自动化测试框架中定位和操作页面元素。
  3. 配置解析:读取和解析配置文件中的信息。
  4. 文档变换:在XSLT转换中使用XPath选择XML文档中的特定部分进行变换。
语法规则
  1. 节点选择

    • tagname:选择所有指定标签名的元素节点。
    • *:选择所有类型的元素节点。
  2. 上下文路径

    • .:选择当前节点。
    • ..:选择当前节点的父节点。
  3. 绝对路径和相对路径

    • /开头的路径是从文档的根节点开始的绝对路径。
    • 不以/开头的路径是相对路径,基于当前节点的位置。
  4. 轴选择器

    • //:选择当前节点下的所有匹配节点,无论它们的位置。
    • /:从根节点或当前节点(如果是相对路径)开始选择。
  5. 属性选择

    • @attribute:选择具有指定属性的所有元素。
  6. 文本节点和属性值

    • text():选择元素的文本节点。
    • @attribute:选择元素的属性值。
  7. 索引和位置选择

    • [index]:选择轴上位于特定索引位置的节点。
  8. 逻辑和比较运算符

    • =!=<><=>=:用于比较运算。
    • andornot用于逻辑运算。
  9. 通配符

    • *:匹配任意元素名。
    • @*:匹配任意属性名。
  10. 函数

    • XPath提供了多种函数,如count()substring()contains()等,用于更复杂的查询。
  11. 谓语表达式

    • [predicate]:在方括号内使用谓语来进一步筛选节点。

XPath的强大之处在于其能够表达复杂的规则来匹配文档中的特定节点,这使得它成为处理XML和HTML文档的强大工具。

在了解xpath的语法规则之后,我们再来看一下python中的lxml库

lxml基本介绍

简介

lxml 是 Python 中一个非常强大的库,用于处理 XML 和 HTML 文档。它提供了高效且易于使用的 API,支持 XML 元素的解析、创建、修改和删除

lxml 库基于 C 语言实现的 libxml2 和 libxslt 库,因此比纯 Python 实现的 XML 处理库有更好的性能。

安装
pip install lxml

安装完成后,你可以通过在 Python 解释器中输入以下命令来检查 lxml 是否已正确安装:

import lxml
print(lxml.__version__)

这应该会打印出 lxml 的版本号,表明它已经安装成功。

如果在安装过程中遇到任何问题,确保你的 pip 是最新版本,可以通过运行 pip install --upgrade pip 来更新它。

作用
  1. 解析 XML/HTML:快速解析 XML 和 HTML 文档。
  2. 元素操作:创建、修改和删除 XML/HTML 文档中的元素。
  3. XPath 支持:使用 XPath 表达式查询和选择文档中的元素。
  4. 转换:支持 XSLT 转换,可以用于文档的转换和模板生成。
  5. 输出:将 XML/HTML 树转换为字符串,包括格式化输出。
  6. 错误处理:提供对解析错误的处理和诊断。
用法
  • 解析文档

    from lxml import etree
    
    # 解析 XML 字符串
    xml_string = "<root><child>Content</child></root>"
    root = etree.XML(xml_string)
    
    # 解析 HTML 字符串
    html_string = "<html><body><p>Hello World!</p></body></html>"
    root = etree.HTML(html_string)

    解释:这部分代码演示了如何使用etree.HTML来解析HTML字符串。它将html_string传递给etree.HTML方法,同样返回一个表示HTML结构的对象root

    总而言之,这段代码展示了lxml库中etree模块用于解析XML和HTML字符串的基本用法。

  • 使用 XPath

    # 使用 XPath 查找元素
     elements = root.xpath('//child')

    解释:这行代码使用XPath表达式'//child'在解析后的XML或HTML文档中查找所有名为"child"的元素。具体来说,'//'表示从根节点开始搜索,而'child'表示要查找名为"child"的元素。

    elements将包含所有匹配的元素,它们可以进一步被操作和处理。

    总之,这行代码演示了如何使用XPath表达式在解析后的文档中查找元素。

  • 修改和添加元素

    # 修改元素文本
    for elem in elements:
        elem.text = 'New Content'
    
    # 添加新元素
    new_elem = etree.SubElement(root, 'newChild')
    new_elem.text = 'This is a new child'

    解释:这部分代码创建了一个名为'newChild'的新元素,并将其文本内容设置为'This is a new child',然后将其添加到根元素中。

    这些操作展示了如何使用lxml库中etree模块对解析后的文档进行元素文本的修改以及添加新元素。

    综上所述,这段代码演示了如何对解析后的XML或HTML文档进行修改操作。

  • 保存文档

    # 将 XML/HTML 树保存到文件
    with open('output.xml', 'wb') as f:
        f.write(etree.tostring(root, pretty_print=True))

    解释:此代码段使用Python的open()方法来打开一个名为'output.xml'的文件,并以二进制模式 ('wb') 进行写操作。然后,使用etree.tostring()方法将XML或HTML树转换为字节流,并将其写入到打开的文件中。参数pretty_print=True用于指定是否在输出的XML中包含格式化空白以提高可读性。

    这段代码将解析后的XML或HTML文档以XML格式保存到名为'output.xml'的文件中。

    总体来说,这段代码展示了如何使用lxml库中的etree模块将XML或HTML树保存到文件中。

案例

解析 HTML 并提取链接

from lxml import etree

html = """
<html>
  <body>
    <a href="https://example.com">Example</a>
    <a href="https://lxml.de">lxml</a>
  </body>
</html>
"""

# 解析 HTML
tree = etree.HTML(html)

# 使用 XPath 提取所有链接的 href 属性
links = tree.xpath('//a/@href')

for link in links:
    print(link)

代码解释

这段代码演示了如何使用lxml库中etree模块解析HTML,并使用XPath提取所有链接的href属性并打印出来。

这行代码导入了lxml库中的etree模块,以便后续使用其提供的功能。

from lxml import etree

接下来,这个代码包含了一个多行的HTML字符串。

html = """
<html>
  <body>
    <a href="https://example.com">Example</a>
    <a href="https://lxml.de">lxml</a>
  </body>
</html>
"""

然后,代码使用etree.HTML()方法解析了HTML字符串,得到了一个表示HTML结构的树。

tree = etree.HTML(html)

这个代码使用XPath表达式'//a/@href'在解析后的HTML树中提取所有<a>元素的href属性。然后通过for循环打印出每个链接的href属性值。

links = tree.xpath('//a/@href')

for link in links:
    print(link)

综上所述,这段代码演示了如何使用lxml库中的etree模块解析HTML,并使用XPath提取链接的href属性并打印出来。

输出结果

可以看到这个控制台中输出两个链接,表明成功提取到目标链接,这个以后我们会经常用到了

创建新的 XML 文档

from lxml import etree

# 创建根元素
root = etree.Element('root')

# 创建子元素并添加到根元素
child = etree.SubElement(root, 'child')
child.text = 'This is a child element'

# 添加属性到子元素
child.set('attr', 'value')

# 将 XML 树转换为字符串并打印
print(etree.tostring(root, pretty_print=True).decode())

代码解释

这段代码演示了如何使用lxml库中etree模块创建XML树添加子元素以及子元素的属性,并将XML树转换为字符串后打印出来。

这行代码导入了lxml库中的etree模块,以便后续使用其提供的功能。

from lxml import etree

这部分代码创建了一个名为'root'的根元素。

root = etree.Element('root')

这段代码创建了一个名为'child'的子元素,并将其文本内容设置为'This is a child element',然后将它添加到根元素中。

child = etree.SubElement(root, 'child')
child.text = 'This is a child element'

这行代码向子元素添加了一个名为'attr'的属性,其值为'value'。

child.set('attr', 'value')

最后,这行代码将XML树转换为字符串,并使用print()函数打印出来。etree.tostring()方法将XML树转换为字节流,参数pretty_print=True用于指定是否在输出的XML中包含格式化空白以提高可读性。.decode()将字节流转换为字符串后进行打印。

print(etree.tostring(root, pretty_print=True).decode())

综上所述,这段代码演示了如何使用lxml库中的etree模块创建XML树、添加子元素及属性,并将XML树转换为字符串后打印出来。

输出结果

可以看到控制台输出的结果是简单的xml树结构,以及子元素具有属性和文本内容的情况。

ok,这一次我们爬虫已经经历过入门级、小成级到大成级,最后我们将要达到爬虫基础的圆满级,相信你一定对基础级的爬虫有个明确的使用的方法和知识体系。

今日心得、到此一游,我是好运,想要好运,期待你的肯定和鼓励

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

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

相关文章

【数据结构练习题】二叉树(1)——1.相同的树2.另一颗树的子树3.翻转二叉树4.平衡二叉树5.对称二叉树

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ ♥♥♥♥♥上一章&#xff1a;队——1.用队实现栈2.用栈实现队♥♥♥♥♥ 文章目录 1.相同的树1.1题目描述1.2 思路分析1.3绘图分析1.4代码实现2.另一颗树的子树2.1问题描述2.2思路分析2.3绘图分析2.…

视觉SLAM学习打卡【11】-尾述

到目前为止&#xff0c;视觉SLAM14讲已经到了终章&#xff0c;历时一个半月&#xff0c;时间有限&#xff0c;有些地方挖掘的不够深入&#xff0c;只能在后续的学习中更进一步。接下来&#xff0c;会着手ORB-SLAM2的开源框架&#xff0c;同步学习C。 视觉SLAM学习打卡【11】-尾…

【linux】多路径|Multipath I/O 技术

目录 简略 详细 什么是多路径? Multipath安装与使用 安装 使用 Linux下multipath软件介绍 附录 配置文件说明 其他解 简略 略 详细 什么是多路径? 普通的电脑主机都是一个硬盘挂接到一个总线上&#xff0c;这里是一对一的关系。 而到了分布式环境&#xff0c;主机和存储网络连…

Linux使用Libevent库实现一个网页服务器---C语言程序

Web服务器 这一个库的实现 其他的知识都是这一个专栏里面的文章 实际使用 编译的时候需要有一个libevent库 gcc httpserv.c -o httpserv -levent实际使用的时候需要指定端口以及共享的目录 ./httpserv 80 .这一个函数会吧这一个文件夹下面的所有文件共享出去 实际的效果, 这…

Matlab之空间坐标系绘制平面图形

在空间直角坐标系中&#xff0c;绘制指定平面方程的图形 版本说明&#xff1a; 20240413_V1.01&#xff1a;更正代码错误&#xff0c;并修改输入参数类型&#xff08;测试用例得修改&#xff09; 20240413_V1.00&#xff1a;初始版本 一、平面方程 基本形式为&#xff1a;A…

[阅读笔记29][AgentStudio]A Toolkit for Building General Virtual Agents

这篇论文是24年3月提交的&#xff0c;提出了一个用于agent开发的全流程工具包。 作者提到目前agent开发主要有两个阻碍&#xff0c;一个是缺乏软件基础&#xff0c;另一个是缺乏在真实世界场景中进行评估。针对这两个阻碍&#xff0c;作者涉及了一个开发工具包&#xff0c;包括…

中颖51芯片学习8. ADC模数转换

中颖51芯片学习8. ADC模数转换 一、ADC工作原理简介1. 概念2. ADC实现方式3. 基准电压 二、中颖芯片ADC功能介绍1. 中颖芯片ADC特性2. ADC触发源&#xff08;1&#xff09;**软件触发**&#xff08;2&#xff09;**TIMER4定时器触发**&#xff08;3&#xff09;**外部中断2触发…

2024第八届图像、信号处理和通信国际会议 (ICISPC 2024)即将召开!

2024第八届图像、信号处理和通信国际会议 &#xff08;ICISPC 2024&#xff09;将于2024年7月19-21日在日本福冈举行。启迪思维&#xff0c;引领未来&#xff0c;ICISPC 2024的召开&#xff0c;旨在全球专家学者共襄盛举&#xff0c;聚焦图像信号&#xff0c;在图像中寻找美&am…

通用大模型研究重点之五:llama family

LLAMA Family decoder-only类型 LLaMA&#xff08;Large Language Model AI&#xff09;在4月18日公布旗下最大模型LLAMA3&#xff0c;参数高达4000亿。目前meta已经开源了80亿和700亿版本模型&#xff0c;主要升级是多模态、长文本方面工作。 模型特点&#xff1a;采用标准的…

企业监管工具:为何如此重要?

随着通信技术的发展&#xff0c;员工使用微信等即时通讯工具来进行工作沟通已经成为了常态。为了帮助企业有效地监管员工的工作微信使用情况&#xff0c;微信管理系统应运而生。 下面就一起来看看&#xff0c;它都有哪些功能吧&#xff01; 1、历史消息&#xff1a;洞察员工聊…

VMware设置Centos7静态ip

1、获取网段&#xff0c;子网掩码和网关 到此获取到的信息&#xff1a; 网段&#xff1a;192.168.204.128 ~ 192.168.204.254 子网掩码&#xff1a;255.255.255.0 网关IP&#xff1a;192.168.204.2 2、修改Centos系统的网络配置 使用命令vim /etc/sysconfig/network-scripts/…

一键搞定线性回归亚组森林图!快速生成顶级SCI论文的高清图!

现在亚组分析好像越来越流行&#xff0c;无论是观察性研究还是RCT研究&#xff0c;亚组分析一般配备森林图。 其实亚组分析的原理十分简单&#xff1a;它一般属于文章的附加内容&#xff0c;文章主体通过对全人群进行分析后&#xff0c;希望在亚组人群中进一步探索暴露与结局的…

DS:顺序表的实现

感谢各位友友的支持&#xff01;目前我的博客进行到了DS阶段&#xff0c;在此阶段首先会介绍一些数据结构相关的知识&#xff0c;然后再进行顺序表的学习。学习数据结构是为后面的通讯录项目打基础。 在学习数据结构之前&#xff0c;需要友友们掌握一些储备知识——结构体、指…

锦瑟香也MYLOVE:音质与颜值俱佳,入坑HiFi的热门好物!

当下尽管无线耳机大行其道&#xff0c;但有线耳机依旧保有其独特的魅力&#xff0c;特别是在音质表现上&#xff0c;它们拥有无线耳机难以企及的优势。如果对音质要求很高的话&#xff0c;口袋里还是少不了一副有线耳机。国产品牌中就有许多性价比高的有线耳机&#xff0c;它们…

Llama 3 开源!手把手带你进行大模型推理,部署,微调和评估

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 基于大模…

Linux网络编程--网络传输

Linux网络编程--网络传输 Linux网络编程TCP/IP网络模型网络通信的过程局域网通信跨网络通信&#xff1a;问题总结&#xff1a; Linux网络编程 TCP/IP网络模型 发送方&#xff08;包装&#xff09;&#xff1a; 应用层&#xff1a;HTTP HTTPS SSH等 —> 包含数据&#xff0…

如何在Windows安装Ollama大语言模型工具并实现无公网IP异地远程使用

文章目录 前言1. 运行Ollama2. 安装Open WebUI2.1 在Windows系统安装Docker2.2 使用Docker部署Open WebUI 3. 安装内网穿透工具4. 创建固定公网地址 前言 本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具&#xff0c;并安装Open WebUI结合cpolar内网穿透软…

pycharm已有项目增加pipenv

pycharm已有项目增加pipenv 第一步 第一步 python base 需要安装pipenv pip install pipenv在设置&#xff0c;project 之后 会自动查找项目下的pipfile 和pipfile.lock 进行pip配置 如果网络较慢&#xff0c;可以修复pipfile下的url 为国内的pip源 [[source]] name "…

centos7安装openGauss数据库企业版

本文章是在CentOS7虚拟机上安装openGauss企业版数据库流程 1.下载安装包: https://opengauss.org/zh/download/ openGauss-5.0.1-CentOS-64bit-all.tar.gz 2.安装python3.6.9 见我的另一篇文章 CentOS7安装Python3-CSDN博客 3.检查工具依赖&#xff1a; 分别检查以下工具是…

符文协议的演变历程:从挑战到创新

在比特币网络长期面临的挑战中&#xff0c;与主流去中心化金融功能的兼容性一直是一大难题。相比之下&#xff0c;以太坊通过ERC-721和ERC-1155代币标准&#xff0c;为NFT和去中心化金融应用提供了支持&#xff0c;而比特币的应用范围却相对有限。然而&#xff0c;近年来&#…