关于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中replace方法实例分析
Aug 20 Python
Python创建日历实例
Aug 21 Python
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 Python
Python批量重命名同一文件夹下文件的方法
May 25 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
python双端队列原理、实现与使用方法分析
Nov 27 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
全网首秀之Pycharm十大实用技巧(推荐)
Apr 27 Python
浅谈tensorflow模型保存为pb的各种姿势
May 25 Python
PyQt5实现画布小程序
May 30 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 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设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
Python全局变量操作详解
2015/04/14 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
Python中time模块和datetime模块的用法示例
2016/02/28 Python
python得到电脑的开机时间方法
2018/10/15 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
python如何实现代码检查
2019/06/28 Python
简单了解python的一些位运算技巧
2019/07/13 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
经管应届生求职信
2013/11/17 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
股东合作协议书
2014/09/12 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
小学美术教学反思
2016/02/17 职场文书
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫
彻底卸载VMware虚拟机的超详细步骤记录
2022/07/15 Servers