关于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实现计算资源图标crc值的方法
Oct 05 Python
python 的列表遍历删除实现代码
Apr 12 Python
深入解读Python解析XML的几种方式
Feb 16 Python
将tensorflow的ckpt模型存储为npy的实例
Jul 09 Python
python实现Flappy Bird源码
Dec 24 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
django删除表重建的实现方法
Aug 28 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
jupyter notebook读取/导出文件/图片实例
Apr 16 Python
通过代码简单了解django model序列化作用
Nov 12 Python
Python matplotlib可视化之绘制韦恩图
Feb 24 Python
Python循环之while无限迭代
Apr 30 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 iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
php引用地址改变变量值的问题
2012/03/23 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
简单了解什么是神经网络
2017/12/23 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
Django中间件基础用法详解
2019/07/18 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
python字典与json转换的方法总结
2020/12/28 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
岗位职责的含义
2013/11/17 职场文书
期终自我鉴定
2014/02/17 职场文书
中班中秋节活动反思
2014/02/18 职场文书
《狼》教学反思
2014/03/02 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
现实表现材料范文
2014/12/23 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL