Python之xpath
xpath是一种在XML文档中定位元素的语言,常用于xml、html文件解析,比css选择器使用方便
XML文件最小构成单元:
- element(元素节点)
- attribute(属性节点)
- text(文本)
- namespace(命名空间)
- processing-instruction(命令处理)
- comment(注释)
- root(根节点)
xpath表达式格式
xpath通过"路径表达式"来选择节点,在表现形式上与传统的文件系统类似
绝对路径(absolute path)必须用"/"起首,后面紧跟根节点,比如/step/step/...
相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step,也就是不使用"/"起首
斜杠(/)作为路径内部的分割符
"/":表示选择根节点
"//":表示选择任意位置的某个节点
"@": 表示选择某个属性
nodename(节点名称):表示选择该节点的所有子节点
xpath功能函数
使用功能函数能够更好的进行模糊搜索
函数 | 用法 | 解释 |
starts-with | xpath(‘//div[starts-with(@id,”ma”)]‘) | 选取id值以ma开头的div节点 |
contains | xpath(‘//div[contains(@id,”ma”)]‘) | 选取id值包含ma的div节点 |
and | xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘) | 选取id值包含ma和in的div节点 |
text() | xpath(‘//div[contains(text(),”ma”)]‘) | 选取节点文本包含ma的div节点 |
xpath定位方法
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <bookstore>
- <book>
- <title lang="eng">Harry Potter</title>
- <price>29.99</price>
- </book>
- <book>
- <title lang="eng">Learning XML</title>
- <price>39.95</price>
- </book>
- </bookstore>
- #bookstore :选取 bookstore 元素的所有子节点。
- #/bookstore :选取根节点bookstore,这是绝对路径写法。
- #bookstore/book :选取所有属于 bookstore 的子元素的 book元素,这是相对路径写法。
- #//book :选择所有 book 子元素,而不管它们在文档中的位置。
- #bookstore//book :选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
- #//@lang :选取所有名为 lang 的属性。
- #/bookstore/book[1] :表示选择bookstore的第一个book子元素。
- #/bookstore/book[last()] :表示选择bookstore的最后一个book子元素。
- #/bookstore/book[last()-1] :表示选择bookstore的倒数第二个book子元素。
- #/bookstore/book[position()<3] :表示选择bookstore的前两个book子元素。
- #//title[@lang] :表示选择所有具有lang属性的title节点。
- #//title[@lang='eng'] :表示选择所有lang属性的值等于"eng"的title节点。
- #/bookstore/book[price] :表示选择bookstore的book子元素,且被选中的book元素必须带有price子元素。
- #/bookstore/book[price>35.00] :表示选择bookstore的book子元素,且被选中的book元素的price子元素值必须大于35。
- #/bookstore/book[price>35.00]/title :表示在例14结果集中,选择title子元素。
- #/bookstore/book/price[.>35.00] :表示选择值大于35的"/bookstore/book"的price子元素。
- #//book/title | //book/price :表示同时选择book元素的title子元素和price子元素。
例2:
- # 我们爬取网页的目的,无非是先定位到DOM树的节点,然后取其文本或属性值
- myPage = '''<html>
- <title>TITLE</title>
- <body>
- <h1>我的博客</h1>
- <div>我的文章</div>
- <div id="photos">
- <img src="pic1.jpeg"/><span id="pic1">PIC1 is beautiful!</span>
- <img src="pic2.jpeg"/><span id="pic2">PIC2 is beautiful!</span>
- <p><a href="http://www.example.com/more_pic.html">更多美图</a></p>
- <a href="http://www.baidu.com">去往百度</a>
- <a href="http://www.163.com">去往网易</a>
- <a href="http://www.sohu.com">去往搜狐</a>
- </div>
- <p class="myclassname">Hello,\nworld!<br/>-- by Adam</p>
- <div class="foot">放在尾部的其他一些说明</div>
- </body>
- </html>'''
- html = etree.fromstring(myPage)
- # 一、定位
- divs1 = html.xpath('//div')
- divs2 = html.xpath('//div[@id]')
- divs3 = html.xpath('//div[@class="foot"]')
- divs4 = html.xpath('//div[@*]')
- divs5 = html.xpath('//div[1]')
- divs6 = html.xpath('//div[last()-1]')
- divs7 = html.xpath('//div[position()<3]')
- divs8 = html.xpath('//div|//h1')
- divs9 = html.xpath('//div[not(@*)]')
- # 二、取文本 text() 区别 html.xpath('string()')
- text1 = html.xpath('//div/text()')
- text2 = html.xpath('//div[@id]/text()')
- text3 = html.xpath('//div[@class="foot"]/text()')
- text4 = html.xpath('//div[@*]/text()')
- text5 = html.xpath('//div[1]/text()')
- text6 = html.xpath('//div[last()-1]/text()')
- text7 = html.xpath('//div[position()<3]/text()')
- text8 = html.xpath('//div/text()|//h1/text()')
- # 三、取属性 @
- value1 = html.xpath('//a/@href')
- value2 = html.xpath('//img/@src')
- value3 = html.xpath('//div[2]/span/@id')
- # 四、定位(进阶)
- # .文档(DOM)元素(Element)的find,findall方法
- divs = html.xpath('//div[position()<3]')
- for div in divs:
- ass = div.findall('a') # 这里只能找到:div->a, 找不到:div->p->a
- for a in ass:
- if a is not None:
- #print(dir(a))
- print(a.text, a.attrib.get('href')) #文档(DOM)元素(Element)的属性:text, attrib
- # .与1等价
- a_href = html.xpath('//div[position()<3]/a/@href')
- print(a_href)
- # .注意与1、2的区别
- a_href = html.xpath('//div[position()<3]//a/@href')
- print(a_href)
Python之xpath的更多相关文章
- python爬虫xpath的语法
有朋友问我正则,,okey,其实我的正则也不好,但是python下xpath是相对较简单的 简单了解一下xpath: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML ...
- python beautifulsoup/xpath/re详解
自己在看python处理数据的方法,发现一篇介绍比较详细的文章 转自:http://blog.csdn.net/lingojames/article/details/72835972 20170531 ...
- Python检查xpath和csspath表达式是否合法
在做一个可视化配置爬虫项目时,需要配置爬虫的用户自己输入xpath和csspath路径以提取数据或做浏览器操作.考虑到用户的有时会输入错误的xpath或csspath路径,后台需要对其做合法性校验. ...
- python爬虫xpath
又是一个大晴天,因为马上要召开十九大,北京地铁就额外的拥挤,人贴人到爆炸,还好我常年挤地铁早已练成了轻功水上漂,挤地铁早已经不在话下. 励志成为一名高级测试工程师的我,目前还只是个菜鸟,难得有机会,公 ...
- Python 关于xpath查找XML元素的一点总结
关于xpath查找XML元素的一点总结 by:授客 QQ:1033553122 欢迎加入全国软件测试qq群:7156436 测试环境 Win7 64 python 3.4.0 实践出真知 代码 ...
- Selenium2+python自动化-xpath定位语法
前言 在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语 ...
- Python中xPath技术和BeautifulSoup的使用
xpath基本知识 XPath语法:使用路径表达式来选取XML或HTML文档中的节点或节点集 路径表达式 nodename:表示选取此节点的所有子节点 / : 表示从根节点选取 // :选择 ...
- python使用xpath(超详细)
使用时先安装 lxml 包 开始使用 和beautifulsoup类似,首先我们需要得到一个文档树 把文本转换成一个文档树对象 from lxml import etree if __name__ = ...
- Python爬虫 XPath语法和lxml模块
XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...
- Python+Requests+Xpath实现动态参数获取实战
1.古诗文网直接登录时,用浏览器F12抓取登录接口的入参,我们可以看到框起来的key对应的value是动态参数生成的,需获取到: 2.登录接口入参的值一般是登录接口返回的原数据值,若刷新后接口与对应源 ...
随机推荐
- iOS导入高德地图出现缺失armv7--"Undefined symbols for architecture armv7"
在已有项目中使用pod导入高德地图,报了以下错误: ld: warning: directory not found for option '-L/Users/paul/iOS/yun-hui-yi/ ...
- 增for语句内容
#author:leon #"hello world!" for i in range(10): #循环十次,每一次循环赋一个0-9中的数字给i . print("--- ...
- try-catch-finally的问题
参考: https://blog.csdn.net/chengzhezhijian/article/details/17264531 面试一家公司的面试题,注: 那个面试官对这个问题挺看重的(可是我回 ...
- Bean的id、name、ref、refid
Spring中Bean的命名 1.每个Bean可以有一个id属性,并可以根据该id在IoC容器中查找该Bean,该id属性值必须在IoC容器中唯一: 2.可以不指定id属性,只指定全限定类名,如: & ...
- ASP.NET MVC Bootstrap模板选中菜单高亮显示当前项方法
当我们处理后台显示当前页面,当前页菜单项高亮,我们可以使用js方法,也可用程序实现,使用Bootstrap模板处理高亮并展开方法之一 1.在项目中导入 <script src="/as ...
- PHP面向对象程序设计之接口(interface)
接口(interface)是抽象方法和静态常量定义的集合.接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量. 为什么说接口是一种特殊的抽象类呢?如果一个抽象类里面的所有的方法都是抽象方法, ...
- TF卡.购买(20180925)
1.准备买 2个 一个 用于 老的手机"红米Note",一个用于现在我的手机"红米Note4X". 之前,这2个手机都是用的 那个坏掉的64g的tf卡 2.刚问 ...
- Angularjs注入拦截器实现Loading效果
angularjs作为一个全ajax的框架,对于请求,如果页面上不做任何操作的话,在结果烦回来之前,页面是没有任何响应的,不像普通的HTTP请求,会有进度条之类. 什么是拦截器? $httpProvi ...
- 关于Jupyter Notebook默认起始目录设置无效的解决方法
一.问题描述 今天折腾jupyter的时候,突然觉得起始目录是用户根目录很麻烦,想着把他改成自己的某个文件,按照网上方法折腾半天也还是无效.东点点西看看才发现端倪. [win10以下好像没这个问题,修 ...
- TextView实现图文混合编排
TextView实现图文混合编排 一.简介 在这里实现图文混合编排使用的是:TextView中预定义的类似Html的标签 二.方法 * 1.设置好html标签的文本 String html=" ...