Python 爬虫入门(五):使用 lxml 解析网页
Python 爬虫入门(五):使用 lxml 解析网页
- 前言
- 1. lxml 简介
- 1.1 什么是 lxml?
- 1.2 为什么选择 lxml?
- 1.3 安装 lxml
- 2. lxml 基础
- 2.1 解析 HTML/XML
- 2.2 XPath 表达式
- 2.3 使用 XPath 提取数据
- 3. 深入解析
- 3.1 处理命名空间
- 3.2 处理属性
- 3.3 处理文本和尾随文本
- 4. 性能优化
- 4.1 使用 iterparse 解析大型文件
- 4.2 避免 XPath 性能陷阱
- 5. 实战演练
- 5.1 项目概述
- 5.2 项目步骤
- 5.3 示例代码
- 总结
前言
欢迎来到“Python 爬虫入门”系列的第五篇文章。今天我们将深入了解HTML/XML解析库——lxml,教你如何使用它来解析网页。
1. lxml 简介
1.1 什么是 lxml?
lxml 是一个Python库,提供了对HTML和XML文件的高效处理能力。
它支持XPath和XSLT,使得在大量数据中查找和提取信息变得非常简单。
1.2 为什么选择 lxml?
- 速度快:lxml 使用C语言编写,因此解析速度非常快。
- 功能强大:支持XPath和XSLT,可以轻松处理复杂的查询。
- 易于使用:API设计简洁,易于学习和使用。
1.3 安装 lxml
使用 pip 安装 lxml:
pip install lxml
2. lxml 基础
2.1 解析 HTML/XML
使用 lxml 解析HTML/XML文件非常简单。
从 lxml 库中导入 etree 模块:
from lxml import etree
使用 etree 解析HTML/XML字符串或文件:
# 解析字符串
html = """
<!DOCTYPE html>
<html><head><!-- 这里可以添加头部信息,比如CSS链接、JavaScript文件链接等 --></head><body><h1>Hello, World!</h1><!-- 这里可以添加更多的HTML内容 --></body>
</html>
"""
root = etree.HTML(html)# 解析文件
tree = etree.parse('demo.html')
root = tree.getroot()
2.2 XPath 表达式
XPath 是一种在XML文档中查找信息的语言。
lxml 利用XPath提供了强大的查询功能。
- 节点轴:如 child::, parent::, descendant:: 等。
- 节点测试:如 *(任意元素节点), text()(文本节点)等。
- 谓语表达式:如 [position()=1](第一个节点), [@attr=‘value’](具有特定属性的节点)等。
2.3 使用 XPath 提取数据

3. 深入解析
3.1 处理命名空间
在解析带有命名空间的XML时,你需要在XPath表达式中声明命名空间。

3.2 处理属性
使用 @ 符号可以轻松获取元素的属性。

3.3 处理文本和尾随文本
在解析元素时,除了获取其子元素外,还可以获取其文本和尾随文本。

4. 性能优化
4.1 使用 iterparse 解析大型文件
当处理大型XML文件时,使用 iterparse 可以节省内存。
for _, element in etree.iterparse('large_file.xml', events=('end',)):if element.tag == 'target_element':process(element)element.clear()
4.2 避免 XPath 性能陷阱
编写高效的XPath表达式可以显著提高解析速度。
- 避免使用通配符 *,因为它会匹配所有元素。
- 使用谓语表达式限制搜索范围。
5. 实战演练
5.1 项目概述
假设我们使用 lxml 解析一个新闻网站,提取新闻标题和链接。
5.2 项目步骤
- 发送 HTTP 请求获取网页内容。
- 使用 lxml 解析网页。
- 使用 XPath 提取新闻标题和链接。
- 将结果保存到文件。
5.3 示例代码
import requests
from lxml import etree# 发送请求
response = requests.get('http://xxx.com/news')
root = etree.HTML(response.content)# 提取新闻标题和链接
news = root.xpath('//div[@class="news-list"]//a')
for item in news:title = item.xpath('text()')[0]link = item.get('href')print(f'Title: {title}, Link: {link}')# 保存结果到文件
with open('news.txt', 'w') as f:for item in news:title = item.xpath('text()')[0]link = item.get('href')f.write(f'{title}, {link}\n')
总结
通过本文的学习,相信你已经掌握了 lxml 的基本使用方法,包括如何解析HTML/XML文件、使用XPath表达式提取数据、处理命名空间和属性、以及性能优化技巧。
如果你觉得本文对你有帮助,请不吝点赞和分享。
相关文章:
Python 爬虫入门(五):使用 lxml 解析网页
Python 爬虫入门(五):使用 lxml 解析网页 前言1. lxml 简介1.1 什么是 lxml?1.2 为什么选择 lxml?1.3 安装 lxml 2. lxml 基础2.1 解析 HTML/XML2.2 XPath 表达式2.3 使用 XPath 提取数据 3. 深入解析3.1 处理命名空间…...
阿里云RDS到亚马逊云RDS的实时数据同步方案详解
1. 需求背景 在当今的多云环境中,企业经常需要在不同云平台之间同步数据。本文将详细介绍如何实现从阿里云RDS MySQL数据库到亚马逊云RDS MySQL数据库的实时数据同步。这种同步对于数据备份、跨区域数据访问、数据分析等场景都非常有用。 2. 方案概述 我们将使用AWS Kinesis…...
《LeetCode热题100》---<滑动窗口篇两道>
本篇博客讲解LeetCode热题100道滑动窗口篇中的两道题 第一道:无重复字符的最长子串 第二道:找到字符当中的所有字母异位词 第一道:无重复字符的最长子串 哈希滑动窗口 class Solution {public int lengthOfLongestSubstring(String s0) {int…...
Python学习计划——9.1多线程编程
并发编程是一种在同一时间段内运行多个任务的方法,可以提高程序的效率和性能。Python中的多线程编程可以使用threading模块实现。以下是多线程编程的详细讲解和可运行的Python案例。 1. 什么是多线程 多线程是一种并发编程的方式,它允许在同一个进程中…...
借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡
原文作者:Chris Akker - F5 技术解决方案架构师,Steve Wagner - F5 NGINX 解决方案架构师 原文链接:借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡 转载来源:NGINX 中文官网 NGINX 唯一中文官方社区 ,…...
基于python的大学学生影响力分析系统设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
upload-labs靶场(1-19关)
upload-labs靶场 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试过程中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共19关,每一关都包含着不同上传方式。 注意:能运行<?php phpinfo();?&…...
Python面向对象浅析
目录 面向对象基本概念 一、类和对象 类和对象是面向对象骗程的两个核心概念。 在程序开发中,要设计一个类,通常需要满足一下三个要素: self详解: 对象(Object) 魔法方法: 类里的一些特殊方法 __in…...
JS基本语法
JS代码写在body结束标签的上面 如点击按钮调用方法: 在浏览器的控制台打印测试数据 console.log() <body><button type"button" onclick"easymethod()">点击我</button><script>//JS代码,写在body标签的…...
LSTM详解总结
LSTM(Long Short-Term Memory)是一种用于处理和预测时间序列数据的递归神经网络(RNN)的改进版本。其设计初衷是为了解决普通RNN在长序列训练中出现的梯度消失和梯度爆炸问题。以下是对LSTM的详细解释,包括原理、公式、…...
制品库nexus
详见:Sonatype Nexus Repository搭建与使用(详细教程3.70.1)-CSDN博客 注意事项: 1.java8环境使用nexus-3.69.0-02-java8-unix.tar.gz包 2.java11环境使用nexus-3.70.1-02-java11-unix.tar.gz包 3.注意使用制品库/etc/yum.repos.…...
2022.11.17 阿里钉钉数据开发岗位一面
今天晚上和阿里钉钉面试官聊了一面,整个过程持续45分钟,还是相当持久的。前面先让我自我介绍,包括自身背景、工作经历和项目经验,在介绍的时候面试官几次打断,让我停下来,然后他提问,我很纳闷还…...
【无标题】Git(仓库,分支,分支冲突)
Git 一种分布式版本控制系统,用于跟踪和管理代码的变更 一.Git的主要功能: 二.准备git机器 修改静态ip,主机名 三.git仓库的建立: 1.安装git [rootgit ~]# yum -y install git 2.创建一个…...
访问控制列表(ACL)
文章目录 ACL原理与基本配置ACL分类ACL组成ACL规则的匹配与应用 ACL原理与基本配置 ACL(Access Control List,访问控制列表) 读取二层、三层、四层报文信息根据预先定义好的规则对报文进行过滤和分类实现网络访问控制、防止网络攻击和提高网络带宽利用率等目的提高…...
自用git命令(待完善)
----------------------------------------------------------------------------------------- ###基础 git config --global user.name "xxxxx" #设置提交人 name git config --global user.email "xxxxxx163.com" #设置提交人 email git …...
突破•指针四
听说这是目录哦 函数指针数组🫧用途:转移表 回调函数🫧能量站😚 函数指针数组🫧 函数指针数组是存放函数地址的数组,例如int (*parr[5])()中parr先和[]结合,说明parr是可以存放5个函数地址【元…...
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
🔸 第一部分:requests库的入口 我们从requests库的入口开始,通常我们会使用 requests.get() 或 requests.post() 等方法发送HTTP请求。那么,这些方法背后究竟做了些什么呢?我们从requests.get()方法开始看起ÿ…...
day1 服务端与消息编码
文章目录 消息的序列化与反序列化通信过程服务端的实现main 函数(一个简易的客户端) 本文代码地址: 本文是7天用Go从零实现RPC框架GeeRPC的第一篇。 使用 encoding/gob 实现消息的编解码(序列化与反序列化)实现一个简易的服务端,仅接受消息,…...
部署WMS仓储管理系统项目后的注意事项
在探讨现代WMS仓储管理系统的部署与运营时,我们不得不深入剖析其背后的多维度考量与策略,以确保这一核心系统能够无缝融入并推动企业的整体供应链优化。WMS仓储管理系统作为连接仓库内部操作与外部供应链的桥梁,其重要性不言而喻,…...
跨网段 IP 地址通信故障分析
现如今计算机网络的规模和复杂性不断增加,跨网段通信成为网络运行中的常见需求。但如果设备处于不同网段且路由设置出现偏差时就会导致通信故障,严重影响网络的正常运行和数据传输。 1.跨网段通信的基本原理 跨网段通信依赖于路由器的路由功能。路由器根…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
