关于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中os和shutil模块实用方法集锦
May 13 Python
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
python通过tcp发送xml报文的方法
Dec 28 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
python安装dlib库报错问题及解决方法
Mar 16 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
QML实现钟表效果
Jun 02 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
May 26 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上传文件问题汇总
2015/01/30 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
php读取本地json文件的实例
2018/03/07 PHP
js 数组克隆方法 小结
2010/03/20 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
AngularJS directive返回对象属性详解
2016/03/28 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
Vue指令指令大全
2019/02/09 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
js实现石头剪刀布游戏
2020/10/11 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
Python中DJANGO简单测试实例
2015/05/11 Python
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
得到Class的三个过程是什么
2012/08/10 面试题
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
Java的类与C++的类有什么不同
2014/01/18 面试题
班会关于环保演讲稿
2013/12/29 职场文书
项目合作协议书
2014/04/16 职场文书