Python 爬虫必备杀器,xpath 解析 HTML

简介: 【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
  1. XPath 简介
  • XPath(XML Path Language)是一种用于在 XML 和 HTML 文档中定位节点的语言。它使用路径表达式来选取 XML/HTML 文档中的节点或者节点集。虽然它是为 XML 设计的,但由于 HTML 可以看作是 XML 的一种应用(XHTML),所以 XPath 也非常适合用于解析 HTML 文档。
  • 例如,一个简单的 HTML 页面可能包含多个<div>标签,使用 XPath 可以精确地定位到包含特定内容的<div>标签,比如定位到包含文章标题的<div>
  1. XPath 基本语法
  • 节点选取
  • 标签名选取:使用标签名可以选取文档中所有该标签的节点。例如,在 HTML 文档中//p会选取所有的<p>段落标签。这就像是在图书馆的书架(HTML 文档)中挑选所有某一类型(标签名)的书籍。
  • 属性选取:通过[@属性名='属性值']的格式可以选取具有特定属性的节点。例如,//a[@href='https://www.example.com']会选取所有href属性值为https://www.example.com<a>链接标签。这就好比挑选所有有特定作者(属性值)的书籍(节点)。
  • 层级关系
  • 父子关系:使用/表示父子关系。例如,//div/p表示选取所有<div>标签下的<p>子标签。可以把它想象成在一个文件夹(<div>)里面找特定文件(<p>)。
  • 祖先 - 后代关系:使用//表示祖先 - 后代关系。//body//p会选取<body>标签内所有的<p>标签,不管它们之间间隔了多少层标签。这类似于在一个大的建筑(<body>)的各个房间(标签)里找特定的物品(<p>)。
  1. 在 Python 爬虫中的应用
  • 安装 lxml 库:在 Python 中,通常使用 lxml 库来支持 XPath 解析。可以通过pip install lxml命令进行安装。lxml 库提供了高效的 XML 和 HTML 解析功能,并且很好地支持 XPath。
  • 解析 HTML 文档示例
  • 首先,使用requests库获取网页内容(假设已经安装了requests库),例如:


import requests
from lxml import etree
url = "https://www.example.com"
response = requests.get(url)
html_content = response.text


  • 然后,使用 lxml 的etree.HTML函数将 HTML 内容转换为可解析的对象:


tree = etree.HTML(html_content)


  • 最后,使用 XPath 表达式来提取信息。比如,要提取网页中所有文章标题(假设标题在<h1>标签中):


titles = tree.xpath("//h1/text()")
for title in titles:
    print(title)


  • 提取复杂结构信息
  • 当需要提取更复杂的信息时,XPath 的优势更加明显。例如,在一个包含商品信息的网页中,商品名称可能在<div class="product - name">标签中,价格在<span class="price">标签中。可以使用以下 XPath 表达式来同时提取名称和价格:


product_names = tree.xpath("//div[@class='product - name']/text()")
product_prices = tree.xpath("//span[@class='price']/text()")
for name, price in zip(product_names, product_prices):
    print(f"商品名称: {name}, 价格: {price}")


  1. XPath 高级技巧
  • 轴(Axis)的使用:轴可以让你在文档树中更灵活地导航。例如,following - sibling轴可以用于选取当前节点之后的兄弟节点。假设你已经定位到一个文章的发布日期节点,想要选取同一行后面的作者姓名节点,可以使用类似//date/following - sibling::author的表达式(这里假设日期标签为<date>,作者标签为<author>)。
  • 函数的应用:XPath 提供了一些函数来增强表达式的功能。比如contains()函数可以用于模糊匹配。如果要查找所有href属性中包含product字样的<a>链接,可以使用//a[contains(@href,'product')]。这在你不确定完整的属性值,但知道部分内容时非常有用。
相关文章
|
1月前
|
数据采集 机器学习/深度学习 Web App开发
Python爬虫如何应对贝壳网的IP封禁与人机验证?
Python爬虫如何应对贝壳网的IP封禁与人机验证?
|
1月前
|
数据采集 Web App开发 JavaScript
无头浏览器技术:Python爬虫如何精准模拟搜索点击
无头浏览器技术:Python爬虫如何精准模拟搜索点击
|
1月前
|
数据采集 Web App开发 JavaScript
Python爬虫解析动态网页:从渲染到数据提取
Python爬虫解析动态网页:从渲染到数据提取
|
2月前
|
数据采集 存储 前端开发
Python爬虫自动化:批量抓取网页中的A链接
Python爬虫自动化:批量抓取网页中的A链接
|
8月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
212 2
|
4月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
395 29
|
4月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
119 4
|
4月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
4月前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。

热门文章

最新文章

推荐镜像

更多