关于python中的xpath解析定位


Posted in Python onMarch 06, 2020

爬取的网站:http://jbk.39.net/chancegz/

这里只针对个别属性值:

#例如:'别名'下的span标签文本,‘发病部位'下的span标签文本以及‘挂号科室‘下的span标签文本
#
def disease(url):
  text = get_html(url)
  tree = etree.HTML(text)
  bm = tree.xpath('//ul[@class="information_ul"]/li/i[text()="别名:"]/following-sibling::span/text()')
 bw = tree.xpath('//ul[@class="information_ul"]/li/i[text()="发病部位:"]/following-sibling::span/a/text()')
 ks = tree.xpath('//ul[@class="information_ul"]/li/i[text()="挂号科室:"]/following-sibling::span/a/text()')
  return bm, bw, ks

补充其他:

# /从根元素开始,相当于绝对路径 
print(tree.xpath('/html/body/ul'))

# //全局搜索,找到所有 
print(tree.xpath('//li')) 
ul = tree.xpath('//ul')

# . 当前
# 返回的都是列表,查找到所有
li = ul[0].xpath('./li')
print(li)
 
for l in li:
 
 # 获取属性id的值 @id
print(l.xpath('./@id')) 

# 定位 /标签[@属性='值'] 
liClass = tree.xpath("//li[@class='liClass']") 
print(liClass) 

#判断,@属性='值' --->返回True或False
print(tree.xpath("//li/@id='12'")) 
print("===========================")
 

#直接使用下标访问,下标从1开始 获取对个li里面的文本
print(tree.xpath('//li[2]/text()'))
#last()最后一个

print(tree.xpath('//li[last()]/text()')) 
#倒数第二个 
print(tree.xpath('//li[last()-1]/text()'))

# position() 位置 > < = >= <= 
print(tree.xpath('//li[position()>1]'))

#* 通配 
print(tree.xpath('//*[@class="liClass"]'))

# 或 | 
print(tree.xpath('//li[@class="liClass"] | //div[@class="liClass"]'))

xpath基本语法

表达式 说明
article 选取所有article元素的所有子节点
/article 选取根元素article
article/a 选取所有属于article的子元素的a元素
//div 选取所有div元素(不管出现在文档里的任何地方)
article//div 选取所有属于article元素的后代的div元素,不管它出现在article之下的任何位置
//@class 选取所有名为class的属性
表达式 说明
/article/div[1] 选取属于article子元素的第一个div元素
/article/div[last()] 选取属于article子元素的最后一个div元素
/article/div[last()-1] 选取属于article子元素的倒数第二个div元素
//div[@color] 选取所有拥有color属性的div元素
//div[@color=‘red'] 选取所有color属性值为red的div元素
表达式 说明
/div/* 选取属于div元素的所有子节点
//* 选取所有元素
//div[@*] 选取所有带属性的div 元素
//div/a 丨//div/p 选取所有div元素的a和p元素
//span丨//ul 选取文档中的span和ul元素
article/div/p丨//span 选取所有属于article元素的div元素的p元素以及文档中所有的 span元素

补充:

相邻元素定位,
前一位:
preceding-sibling::div[1]
后一位:
following-sibling::div[1]

前N位:
preceding-sibling::div[N]
后N位:
following-sibling::div[N]


# 爬取i标签中包含相关检查节点的兄弟 a节点(找到i节点—>找到其父节点->找到该父节点的子节点a)
content = tree.xpath('//i[contains(text(),"相关检查:")]/../a[@class="blue"]/text()')
    
    
xpath多个class限制
//div[contains(@class, 'demo') and contains(@class, 'other')]

xpath 同时多个标签用| 分隔
//div[contains(@class, "jib-lh-articl")]/p | //div[contains(@class, "jib-lh-articl")]/h3

选择不包含某一属性的节点
//div[not(@class)] 没有class属性的div
//tbody/tr[not(@class or @id)]

获取当前节点的是什么类型的html标签
xpath_element.tag

补充知识:使用Xpath定位元素(和元素定位相关的Xpath语法)

本文主要讲述Xpath语法中,和元素定位相关的语法

第一种方法:通过绝对路径做定位(相信大家不会使用这种方式)

By.xpath("html/body/div/form/input")

第二种方法:通过相对路径做定位

两个斜杠代表相对路径

By.xpath("//input//div")

第三种方法:通过元素索引定位

By.xpath("//input[4]")

第四种方法:使用xpath+节点属性定位(结合第2、第3中方法可以使用)

By.xpath("//input[@id='kw1']")
By.xpath("//input[@type='name' and @name='kw1']")

第五种方法:使用部分属性值匹配(最强大的方法)

By.xpath("//input[start-with(@id,'nice')]")
By.xpath("//input[ends-with(@id,'很漂亮')]")
By.xpath("//input[contains(@id,'那么美')]")

第六种方法:使用前集中方法的组合

By.xpath("//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])

以上这篇关于python中的xpath解析定位就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
初步解析Python中的yield函数的用法
Apr 03 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
Python3之简单搭建自带服务器的实例讲解
Jun 04 Python
对PyTorch torch.stack的实例讲解
Jul 30 Python
Python使用sort和class实现的多级排序功能示例
Aug 15 Python
Python调用服务接口的实例
Jan 03 Python
解决Django Static内容不能加载显示的问题
Jul 28 Python
python实现画循环圆
Nov 23 Python
解决Pytorch 加载训练好的模型 遇到的error问题
Jan 10 Python
Python itertools.product方法代码实例
Mar 27 Python
python 线程的五个状态
Sep 22 Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 #Python
appium+python adb常用命令分享
Mar 06 #Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 #Python
python使用paramiko实现ssh的功能详解
Mar 06 #Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
Mar 06 #Python
Python object类中的特殊方法代码讲解
Mar 06 #Python
python+Selenium自动化测试——输入,点击操作
Mar 06 #Python
You might like
解析php file_exists无效的解决办法
2013/06/26 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
python中return不返回值的问题解析
2020/07/22 Python
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
Java的五个基础面试题
2016/02/26 面试题
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
打架检讨书
2015/01/27 职场文书
学生退学证明
2015/06/23 职场文书
Python一些基本的图像操作和处理总结
2021/06/23 Python