关于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中的四种队列
May 21 Python
基于Python对数据shape的常见操作详解
Dec 25 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
详解python:time模块用法
Mar 25 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
Django框架模型简单介绍与使用分析
Jul 18 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
Django之form组件自动校验数据实现
Jan 14 Python
python使用numpy实现直方图反向投影示例
Jan 17 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
详解pandas apply 并行处理的几种方法
Feb 24 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脚本的10个技巧(3)
2006/10/09 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
纯javascript版日历控件
2016/11/24 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
详解AngularJS1.x学习directive 中‘&amp; ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
js实现上传并压缩图片效果
2018/01/10 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
python 排序算法总结及实例详解
2016/09/28 Python
Python中查看文件名和文件路径
2017/03/31 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
Numpy之random函数使用学习
2019/01/29 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
出国留学计划书
2014/04/27 职场文书
安全环保标语
2014/06/09 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
五一活动标语
2014/06/30 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
vue实现简易音乐播放器
2022/08/14 Vue.js