当前位置: 首页 > news >正文

Python 爬虫入门 Day 5 - 使用 XPath 进行网页解析(lxml + XPath)

Python 第二阶段 - 爬虫入门

🎯 今日目标

  • 掌握 XPath 的基本语法
  • 使用 lxml.etree 解析 HTML,提取数据
  • 与 BeautifulSoup 比较:谁更强?

📘 学习内容详解

✅ 安装依赖
pip install lxml
🧩 XPath 简介

XPath 是一种用于在 XML/HTML 中查找信息的语言,功能强大,支持复杂结构提取。

常见语法:

XPath 表达式含义
//tag所有指定标签
//div[@class="quote"]class 为 quote 的所有 div 标签
.//span[@class="text"]/text()当前元素内的 span.text 的内容
//a/@href提取 a 标签的 href 属性值

📌 示例代码
from lxml import etree
import requestsurl = "https://quotes.toscrape.com/"
res = requests.get(url)
tree = etree.HTML(res.text)quotes = tree.xpath('//div[@class="quote"]')for q in quotes:text = q.xpath('.//span[@class="text"]/text()')[0]author = q.xpath('.//small[@class="author"]/text()')[0]tags = q.xpath('.//div[@class="tags"]/a[@class="tag"]/text()')print(f"{text} —— {author} [Tags: {', '.join(tags)}]")

📊 XPath vs BeautifulSoup

对比项BeautifulSoupXPath (lxml)
学习曲线简单稍复杂
功能强度
性能一般较快
选择方式标签/类名/选择器路径表达式
适合人群初学者熟悉 HTML 的开发者

🧪 今日练习任务

  1. 使用 XPath 提取名言、作者、标签

  2. 获取所有页数据(分页跳转)

  3. 统计作者数量 & 不重复的标签数

  4. 保存数据为 JSON 文件

    示例代码:

    import requests
    from lxml import etree
    import json
    import timeBASE_URL = "https://quotes.toscrape.com"
    HEADERS = {"User-Agent": "Mozilla/5.0"
    }def fetch_html(url):response = requests.get(url, headers=HEADERS)return response.text if response.status_code == 200 else Nonedef parse_quotes(html):tree = etree.HTML(html)quotes = tree.xpath('//div[@class="quote"]')data = []for q in quotes:text = q.xpath('.//span[@class="text"]/text()')[0]author = q.xpath('.//small[@class="author"]/text()')[0]tags = q.xpath('.//div[@class="tags"]/a[@class="tag"]/text()')data.append({"text": text,"author": author,"tags": tags})return datadef get_next_page(html):tree = etree.HTML(html)next_page = tree.xpath('//li[@class="next"]/a/@href')return BASE_URL + next_page[0] if next_page else Nonedef main():all_quotes = []url = BASE_URLwhile url:print(f"正在抓取:{url}")html = fetch_html(url)if not html:print("页面加载失败")breakquotes = parse_quotes(html)all_quotes.extend(quotes)url = get_next_page(html)time.sleep(0.5)  # 模拟人类行为,防止被封# 输出抓取结果print(f"\n共抓取名言:{len(all_quotes)} 条")# 保存为 JSONwith open("quotes_xpath.json", "w", encoding="utf-8") as f:json.dump(all_quotes, f, ensure_ascii=False, indent=2)print("已保存为 quotes_xpath.json")if __name__ == "__main__":main()
    

✍️ 今日总结

  • 学会使用 XPath 精确定位 HTML 元素
  • 掌握了 lxml.etree.HTML 的解析方法
  • 对比了两种主流网页解析方式,为后续复杂数据提取打好基础
http://www.lryc.cn/news/571163.html

相关文章:

  • springboot使用kafka
  • Jmeter的三种参数化方式详解
  • web前端开发核心基础:Html结构分析,head,body,不同标签的作用
  • Java内存模型与线程
  • Anaconda 使用
  • 力扣经典算法篇-17-反转字符串中的单词(逆序遍历,数组分割,正则表达式)
  • 4_STM32F103ZET6芯片系统架构和寄存器
  • 通过自适应训练样本选择弥合基于锚点和无锚点检测之间的差距之ATSS论文阅读
  • 【论文阅读】BACKDOOR FEDERATED LEARNING BY POISONING BACKDOOR-CRITICAL LAYERS
  • Matlab自学笔记五十九:符号变量的代入和替代subs精讲
  • Windows10安装WSL Ubuntu
  • 设计模式:单例模式多种方式的不同实现
  • vue中diff算法的原理
  • 把springboot打包为maven可引入的jar
  • Maven 的 settings.xml详解
  • 深度学习中常见的激活函数分析
  • Android Studio Jetpack Compose毛玻璃特效按钮
  • 【数据结构】栈和队列详解
  • 线性放大器设计方案:248-双极性任意波1M带宽400Vpp高压线性放大器
  • 欧拉安装vboxlinuxadditions时,出错
  • 第九章——8天Python从入门到精通【itheima】-95~96-Python的异常模块与包(自定义模块并导入+自定义Python包)
  • MySQL 命令行的核心操作命令详解
  • 资深Java工程师的面试题目(一)微服务
  • 如何高效分享WordPress博客文章
  • Sparse4D: 稀疏范式的端对端融合
  • (100)课126: 间隙锁临键锁,是为了锁定索引B+树里叶节点之间的间隙,不允许别的事务在这些间隙里插入新的叶节点,从而阻止幻读
  • 振动测控模块设计原理图:276-16路AD、10路DA嵌入式振动测控模块
  • 自然语言处理文本分类
  • Node.js 项目启动命令全面指南:从入门到精通(术语版)
  • Redis中的分布式锁之SETNX底层实现