标题 | 详情 |
---|---|
作者简介 | 愚公搬代码 |
头衔 | 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。 |
近期荣誉 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。 |
博客内容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 |
欢迎 | 👍点赞、✍评论、⭐收藏 |
🚀前言
在现代网页开发和数据抓取中,获取和处理网页中的信息是非常关键的一环。而在众多的数据提取技术中,XPath(XML Path Language)以其强大的选择能力和灵活性,成为了网页解析的重要工具。无论是提取特定元素的文本内容,还是获取复杂结构中的数据,掌握XPath的使用都能大幅提高我们的数据处理效率。
在本期文章中,我们将深入探讨XPath解析的基本概念和应用技巧。我们将介绍XPath的语法、常用函数及其在Python中的实现方法,帮助你快速上手并应对各种数据提取的需求。通过具体的实例演示,我们将展示如何利用XPath解析网页,提取所需的信息,并为后续的数据分析和处理做好准备。
🚀一、XPath解析
🔎1.XPath 概述
🦋1.1 XPath 是什么?
- 全称:XML Path Language
- 功能:在 XML/HTML 中通过路径表达式定位节点
- 特性:
- 支持 100+ 内建函数(字符串、数值、逻辑处理等)
- W3C 标准(1999年发布)
- 路径表达式简洁高效
🦋1.2 常用路径表达式
表达式 | 描述 |
---|---|
nodename |
选取当前节点的所有子节点 |
/ |
从根节点开始直接子节点 |
// |
从当前节点选取所有子孙节点 |
. |
当前节点 |
.. |
父节点 |
@ |
选取属性 |
* |
通配符(匹配所有节点) |
🔎2.XPath 解析操作
🦋2.1 解析 HTML
☀️2.1.1 parse()
方法
- 功能:解析本地 HTML 文件
- 示例:
from lxml import etree parser = etree.HTMLParser() html = etree.parse('demo.html', parser=parser) html_str = etree.tostring(html, encoding="utf-8").decode('utf-8') print(html_str)
☀️2.1.2 HTML()
方法
-
功能:解析字符串或网络返回的 HTML
-
示例:
from lxml import etree # 导入etree子模块 # 定义html字符串 html_str = ''' <title>标题文档</title> </head> <body> <img src="./demo_files/logo1.png" /> <br /> hello 明日科技 ~ </body></html>''' html = etree.HTML(html_str) # 解析html字符串 html_txt = etree.tostring(html,encoding = "utf-8") # 转换字符串类型,并进行编码 print(html_txt.decode('utf-8')) # 打印解码后的HTML代码
-
功能:解析服务器返回的 HTML
-
示例:
from lxml import etree # 导入etree子模块 import requests # 导入requests模块 from requests.auth import HTTPBasicAuth # 导入HTTPBasicAuth类 # 定义请求地址 url = 'http://sck.rjkflm.com:666/spider/auth/' ah = HTTPBasicAuth('admin','admin') # 创建HTTPBasicAuth对象,参数为用户名与密码 response = requests.get(url=url,auth=ah) # 发送网络请求 if response.status_code==200: # 如果请求成功 html = etree.HTML(response.text) # 解析html字符串 html_txt = etree.tostring(html,encoding = "utf-8") # 转换字符串类型,并进行编码 print(html_txt.decode('utf-8')) # 打印解码后的HTML代码
🦋2.2 获取节点
☀️2.2.1 所有节点
from lxml import etree # 导入etree子模块
# 定义html字符串
html_str = '''
<div class="level_one on">
<ul>
<li> <a href="/index/index/view/id/1.html" title="什么是Java" class="on">什么是Java</a> </li>
<li> <a href="javascript:" onclick="login(0)" title="Java的版本">Java的版本</a> </li>
<li> <a href="javascript:" onclick="login(0)" title="Java API文档">Java API文档</a> </li>
<li> <a href="javascript:" onclick="login(0)" title="JDK的下载">JDK的下载</a> </li>
<li> <a href="javascript:" onclick="login(0)" title="JDK的安装">JDK的安装</a> </li>
<li> <a href="javascript:" onclick="login(0)" title="配置JDK">配置JDK</a> </li>
</ul>
</div>
'''
html = etree.HTML(html_str) # 解析htm