关于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静态方法实例
Jan 14 Python
简单理解Python中的装饰器
Jul 31 Python
python处理html转义字符的方法详解
Jul 01 Python
Python简单操作sqlite3的方法示例
Mar 22 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
Aug 23 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
Python定义一个Actor任务
Jul 29 Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 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启动时候提示PHP startup的解决方法
2013/05/07 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
php格式化金额函数分享
2015/02/02 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
设定php简写功能的方法
2019/11/28 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
javascript new一个对象的实质
2010/01/07 Javascript
jquery trim() 功能源代码
2011/02/14 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Python 专题三 字符串的基础知识
2017/03/19 Python
python3获取url文件大小示例代码
2019/09/18 Python
python中逻辑与或(and、or)和按位与或异或(&amp;、|、^)区别
2020/08/05 Python
浅析Python requests 模块
2020/10/09 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
Python的collections模块真的很好用
2021/03/01 Python
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
大学生村官典型材料
2014/01/12 职场文书
《悯农》教学反思
2014/04/28 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python