网页解析与lxml

网页解析与lxml

2026年9月19日·#编程学习/python学习笔记Python/爬虫·871 字 4 分钟
浏览量加载中...
AI 摘要

用 lxml 库把 HTML 解析成文档对象,再用 Xpath 从标签里提取表头和行数据

网页解析是什么#

网页解析指的是从原始 HTML 文档中提取数据的过程,也是网络爬虫的关键步骤——从一堆标签文本中提取出需要的数据。

比如把这段 HTML:

<html>
<head><title>仙逆人物志 - 修真世界</title></head>
<body>
<h1>Python</h1>
<p>一门简介、快速、易用的编程语言。</p>
<a href="https://www.itcast.cn">传智教育-黑马程序员</a>
</body>
</html>

解析出:标题 仙逆人物志 - 修真世界Python一门简介...、链接文本与地址。

lxml 库#

lxml 是一个高性能的 HTML/XML 文档解析库,支持基于 Xpath 语法来解析和获取网页数据。

Terminal window
pip install lxml

入门程序:解析本地 HTML 文件#

from lxml import html
# 读取 html 文件
with open("resources/仙逆人物志.html", "r", encoding="utf-8") as f:
html_text = f.read()
# 解析 html 文本, 将其转换为一个文档对象
document = html.fromstring(html_text)
# 解析表头 - xpath 语法
th_list = document.xpath("//table/thead/tr/th/text()")
print(th_list)
# 解析表格中的所有行数据
tr_list = document.xpath("//table/tbody/tr")
for tr in tr_list:
td_list = tr.xpath("./td/text()")
print(td_list)

逐段理解#

代码说明
from lxml import html导入 lxml 的 html 模块
html.fromstring(html_text)把 HTML 字符串解析成文档对象(之后才能用 Xpath 查询)
document.xpath("//table/thead/tr/th/text()")定位表头里每个 th,取它们的文本,返回列表
document.xpath("//table/tbody/tr")定位 tbody 下的所有 tr(行),返回元素列表
tr.xpath("./td/text()")当前这一行下找直接子元素 td 并取文本
Important

./td//td 的区别:./td 是在当前节点下找直接子元素(只找这一行自己格子里的);//td 是从任意位置找(会把整份文档里所有 td 都抓出来)。遍历行的时候必须用 ./,否则每行拿到的都是全部数据。

相关#

练习题#

一、回忆填空(写完再展开对答案)#

  1. 网页解析指的是从原始 ____ 文档中提取数据的过程,是爬虫的 ____ 步骤
  2. lxml 是一个高性能的 ____ / XML 文档解析库,支持基于 ____ 语法获取数据
  3. 安装命令:pip ____ lxml
  4. 把 HTML 字符串解析成文档对象:html.____(html_text)
  5. Xpath 表达式末尾加 /text() 的作用是 ____
  6. document.xpath("//table/tbody/tr") 返回的是所有 ____ 元素的列表
  7. 在遍历行时,取”这一行的格子”要用 ____/td/text() 而不是 //td/text()
填空答案(做完再点开)
  1. HTML / 关键 2. HTML、Xpath 3. install 4. fromstring 5. 获取元素的文本内容 6. tr(行) 7. ./

二、裸写题#

  • 2-1 解析表头 读取 resources/仙逆人物志.html,解析出表格的表头并打印。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:读文件 → 变文档对象 → Xpath 定位表头 二级 · 方法open(...) / html.fromstring / //table/thead/tr/th/text() 三级 · 骨架document = html.____(html_text)

  • 2-2 解析所有行 把表格里每一行的数据都打印出来(每行是一个列表)。

    提示

    一级 · 思路:先拿到所有行,再一行一行往里取格子 二级 · 方法//table/tbody/tr + 循环里 ./td/text() 三级 · 骨架for tr in tr_list:\n print(tr.xpath("____/td/text()"))

  • 2-3 只要第一行 只解析 tbody 的第 2 行(提示:Xpath 里序号从 1 开始),打印它的数据。

    提示

    一级 · 思路:用序号过滤 二级 · 方法//table/tbody/tr[2]/td/text() 三级 · 骨架tr[____]

参考答案(做完再点开)
from lxml import html
# 2-1
with open("resources/仙逆人物志.html", "r", encoding="utf-8") as f:
html_text = f.read()
document = html.fromstring(html_text)
th_list = document.xpath("//table/thead/tr/th/text()")
print(th_list)
# 2-2
tr_list = document.xpath("//table/tbody/tr")
for tr in tr_list:
print(tr.xpath("./td/text()"))
# 2-3(Xpath 序号从 1 开始,第 2 行就是 tr[2])
td_list = document.xpath("//table/tbody/tr[2]/td/text()")
print(td_list)

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# Ajax2# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc3# CSS6# DeepSeek6# deepseek2# DELETE1# Docker1# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML6# HTTP5# ImageManager1# Java23# java13# JavaScript5# JDBC3# JSON2# JUnit1# LangChain25# Logback1# Maven6# Muse Spark1# Mybatis1# MyBatis4# MySQL28# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python65# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot11# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue7# Waline3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端32# 动态1# 动漫1# 包1# 单词2# 博客7# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 对象1# 导航栏1# 工具2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程1# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常92# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试1# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]