关于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 02 Python
Python列表推导式与生成器表达式用法示例
Feb 08 Python
Django处理文件上传File Uploads的实例
May 28 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
从0开始的Python学习016异常
Apr 08 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
May 15 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
Python中无限循环需要什么条件
May 27 Python
使用Python解决图表与画布的间距问题
Apr 11 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 作用域解析运算符(::)
2010/07/27 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
python中正则表达式的使用详解
2014/10/17 Python
Python中暂存上传图片的方法
2015/02/18 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
Python读取word文本操作详解
2018/01/22 Python
python PyTorch预训练示例
2018/02/11 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
python list格式数据excel导出方法
2018/10/31 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
优秀学生干部个人的自我评价
2013/10/04 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
演讲比赛策划方案
2014/06/11 职场文书
县委务虚会发言材料
2014/10/20 职场文书
老干部座谈会主持词
2015/07/03 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL