关于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实现二叉搜索树
Feb 03 Python
Python迭代和迭代器详解
Nov 10 Python
Python正则表达式教程之三:贪婪/非贪婪特性
Mar 02 Python
Python selenium抓取微博内容的示例代码
May 17 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
python七夕浪漫表白源码
Apr 05 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
python 3.8.3 安装配置图文教程
May 21 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 Python
Django中和时区相关的安全问题详解
Oct 12 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
用Python编写简单的gRPC服务的详细过程
Jul 04 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初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
python操作 hbase 数据的方法
2016/12/18 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
美国第二大连锁书店:Books-A-Million
2017/12/28 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
linux面试题参考答案(6)
2014/08/29 面试题
学生实习自我鉴定
2013/10/11 职场文书
外贸业务员工作职责
2014/01/06 职场文书
七夕活动策划方案
2014/08/16 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
九九重阳节致辞
2015/07/31 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL