关于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利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
Python函数式编程指南(四):生成器详解
Jun 24 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 Python
Python探索之SocketServer详解
Oct 28 Python
python实现人脸识别代码
Nov 08 Python
Java及python正则表达式详解
Dec 27 Python
Django model序列化为json的方法示例
Oct 16 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
python多线程实现代码(模拟银行服务操作流程)
Jan 13 Python
基于Keras的格式化输出Loss实现方式
Jun 17 Python
python 实现端口扫描工具
Dec 18 Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 06 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
在数据量大(超过10万)的情况下
2007/01/15 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
用python写asp详细讲解
2013/12/16 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
Python for循环中的陷阱详解
2018/07/13 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
Python Django基础二之URL路由系统
2019/07/18 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
python轮询机制控制led实例
2020/05/03 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
大学毕业生通用自荐信范文
2013/10/31 职场文书
研究生求职自荐书
2014/06/23 职场文书
语文复习计划
2015/01/19 职场文书
卫生保健工作总结2015
2015/05/18 职场文书