关于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的迭代器、生成器以及相关的itertools包
Apr 02 Python
python实现分页效果
Oct 25 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
Python 修改列表中的元素方法
Jun 26 Python
Python爬虫beautifulsoup4常用的解析方法总结
Feb 25 Python
如何更优雅地写python代码
Jul 02 Python
python GUI模拟实现计算器
Jun 22 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
python字典的元素访问实例详解
Jul 21 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实现短域名互转
2013/07/05 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
JavaScript大数相加相乘的实现方法实例
2020/10/18 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
Python实现的建造者模式示例
2018/08/06 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
python实现爬山算法的思路详解
2019/04/09 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
python GUI计算器的实现
2020/10/09 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
弘扬民族精神演讲稿
2014/05/07 职场文书
质量负责人任命书
2014/06/06 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
法定代表人资格证明书
2015/06/18 职场文书
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS