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

Python爬虫学习笔记(五)——XPath的使用

介绍

XPath,全称XML Path Language,即XML路径语言,用来搜寻XML文档,也同样适用于HTML文档的搜索。所以,在做爬虫的时候,就可以使用XPath来做相应的信息抽取。python中相应的库为lxml库,需要自行安装

正文

XPath主要是有大量的方法,故我主要用代码的形式来记录。
XPath常用规则

表达式描述
nodename
/选取此节点的所有子节点
//从当前节点选取直接子节点
.选取当前节点
..选取当前节点的父节点
@选取属性

常用功能

from lxml import etree

text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">thirst item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
# 直接读取
html = etree.HTML(text)
# 读取文件
html = etree.parse('./test.html', etree.HTMLParser())

# 选取所有节点
result = html.xpath('//*')
# 选取所有li节点 
result = html.xpath('//li')
# 选取li节点的所有直接a子节点
# 这里需要注意/和//的区别。前者是直接子节点,换句话说,直接子节点的子节点不是我的直接子节点;后者则是全部子节点
result = html.xpath('//li/a')
# 属性匹配
#选取class属性为item-0的li节点
result = html.xpath('//li[@class=''item-0'']')
# 属性获取
# 获取li节点下所有a节点的href属性
result = html.xpath('//li/a/@href')
# 属性多值匹配
# 如果属性有多个值,就需要用contain()函数
result = html.xpath('//li[contain(@class, "li")]/a/text()')
# 多属性匹配
# 如果有多个属性,可以用运算符,例如and
result = html.xpath('//li[contain(@class, "li") and @name="item"]/a/text()')
# 选取父节点
# 选取href属性为link4.html的a节点,获取其父节点,然后再获取其class属性
## 方法一
result = html.xpath('//a[@href="link4.html"/../@class')
## 方法二
result = html.xpath('//a[@href="link4.html"/parent::*/@class')
# 文本获取
## 错误示范,li后面还有一个a节点,所需要的是a节点的内容
result = html.xpath('//li[@class="item-0"]/text()')
## 正确代码
result = html.xpath('//li[@class="item-0"]/a/text()')
# 按序选择
## 选取第一个li节点
result =html.xpath('//li[1]/a/text()')
## 选取最后一个li节点
result =html.xpath('//li[last()]/a/text()')
## 选取位置小于3的li节点
result =html.xpath('//li[postion()<3]/a/text()')
## 选取倒数第三个li节点
result =html.xpath('//li[last()-2]/a/text()')
# 节点轴选择
## ancestor轴,获取所有祖先节点
result = html.xpath('//li[1]/ancetor::*')
## 加上限定条件的ancestor轴
result = html.xpath('//li[1]/ancetor::div')
## attribute轴,获取所有属性值
result = html.xpath('//li[1]/attribute::*')
## child轴,获取所有直接子节点,加上限定条件
result = html.xpath('//li[1]/child::a[@href="link1.html"]')
## descenda轴,可以获取所有子孙节点,加上限定条件为span节点,只获取span节点
result = html.xpath('//li[1]/descendant::span')
## following轴,获取当前节点之后的所有节点,加上索引表示第几个后序节点
result = html.xpath('//li[1]/following::*[2]')
## following-sibling轴,获取当前节点之后所有同级节点
result = html.xpath('//li[1]/following-sibling::*')

总结

XPath有十分强大的功能,而且提供了十分丰富的内容,难度固然不高,但是大量的内容需要熟练的使用才能掌握。但我个人其实有些疑问,似乎有很多方法只是实现了相同的一个功能,还不了解其中有什么区别。
XPath的用法可以查看:http://www.w3school.com.cn/xpath/index.asp
lxml库的用法可以查看:http://lxml.de/

转载于:https://www.cnblogs.com/HackHarry/p/9593075.html

相关文章:

  • OSSEC安全监控环境搭建(docker+yum)安装
  • MySQL事务隔离级别、锁信息
  • 洛谷P2261 [CQOI2007]余数求和
  • Office 365发送超大附件
  • react-native 学习心得
  • 使用WPF技术模拟手机界面
  • 移动端常用的 UI 库
  • [转] 三种方法实现js跨域访问
  • 20172328 2018-2019《Java软件结构与数据结构》第一周学习总结
  • 14.spark mllib之快速入门
  • MySql文件
  • findbugs静态代码分析工具使用教程
  • 【unity实用技能】记一次失败的蓝图接口开发失败经验
  • SQLServer之索引简介
  • 如何优雅地关闭Go channel
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2017-08-04 前端日报
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Cumulo 的 ClojureScript 模块已经成型
  • JAVA多线程机制解析-volatilesynchronized
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Laravel Telescope:优雅的应用调试工具
  • laravel 用artisan创建自己的模板
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Meteor的表单提交:Form
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • PV统计优化设计
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 从零搭建Koa2 Server
  • 大型网站性能监测、分析与优化常见问题QA
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 汉诺塔算法
  • 事件委托的小应用
  • 手写一个CommonJS打包工具(一)
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • const的用法,特别是用在函数前面与后面的区别
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • #define,static,const,三种常量的区别
  • #HarmonyOS:基础语法
  • #laravel 通过手动安装依赖PHPExcel#
  • (11)MATLAB PCA+SVM 人脸识别
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)springcloud实战之config配置中心
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (转)ABI是什么
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core中Emit的使用
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @font-face 用字体画图标
  • @RequestBody与@ModelAttribute
  • @test注解_Spring 自定义注解你了解过吗?