xpath总结
Python包
pip install lxml
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。
xpath语法
/ 代表根路径, 在下面的实例中能够找到/html, 找不到/body
from lxml import etree
html = """<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul>
<li class="item-"><a id='i1' href="link.html">first item</a></li>
<li class="item-0"><a id='i2' href="llink.html">first item</a></li>
<li class="item-1"><a href="llink2.html">second item<span>vv</span></a></li>
</ul>
<div><a href="llink2.html">second item</a></div>
</body>
</html>
""" page = etree.HTML(html)
a = page.xpath("/html")
b = page.xpath("/body")
print(a) # [<Element html at 0x1e9c3aa4508>]
print(b) # []
// 代表任何路径, 在下面的例子中,我们甚至可以选到li标签
from lxml import etree
html = """<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul>
<li class="item-"><a id='i1' href="link.html">first item</a></li>
<li class="item-0"><a id='i2' href="llink.html">first item</a></li>
<li class="item-1"><a href="llink2.html">second item<span>vv</span></a></li>
</ul>
<div><a href="llink2.html">second item</a></div>
<a>我是直属body的</a>
</body>
</html>
""" page = etree.HTML(html)
a = page.xpath("//li")
print(a)
/可以嵌套使用,如下实例
from lxml import etree
html = """<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul>
<li class="item-"><a id='i1' href="link.html">first item</a></li>
<li class="item-0"><a id='i2' href="llink.html">first item</a></li>
<li class="item-1"><a href="llink2.html">second item<span>vv</span></a></li>
</ul>
<div><a href="llink2.html">second item</a></div>
</body>
</html>
""" page = etree.HTML(html)
a = page.xpath("//a")
b = page.xpath("//div/a")
print(a) # 他有4个
print(b) # 而div下的只有一个
.和..分别是当前节点和当前节点的父节点
from lxml import etree
html = """<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul>
<li class="item-"><a id='i1' href="link.html">first item</a></li>
<li class="item-0"><a id='i2' href="llink.html">first item</a></li>
<li class="item-1"><a href="llink2.html">second item<span>vv</span></a></li>
</ul>
<div><a href="llink2.html">second item</a></div>
</body>
</html>
""" page = etree.HTML(html)
a = page.xpath("//ul")
print(a[0].xpath("./li")) # 在ul下可以找到3个li
print(a[0].xpath("../li")) # 而在ul的父标签下找不到li
print(a[0].xpath("../div")) # 但是却可以找到div
66的中括号, 说出来你可能不信. 这个中括号可以根据索引取, 根据属性取, 还不是一般的索引和属性
还是用上面的那个html
a = page.xpath("//li[1]/a/text()") # 取第一个
a = page.xpath("//li[last()]/a/text()") # 取最后一个
a = page.xpath("//li[last()-1]/a/text()") # 取倒数第二个, 减几都行
# 上面是取固定的, 下面是按范围
a = page.xpath("//li[position()<3]/a/text()") # 小于3的前两个
# [@attr] 可以按照属性取值
a = page.xpath("//li[@class]/a/text()") # 这样三个就都取出来了
a = page.xpath("//li[@class='item-0']/a/text()") # 只取出来固定属性的
# 甚至可以按照元素值的大小来查找
'''
<li class="item-"> <count>88</count> <a id='i1' href="link.html">first item</a></li>
<li class="item-0"><count>77</count> <a id='i2' href="llink.html">first item2</a></li>
<li class="item-1"><count>66</count> <a href="llink2.html">second item<span>vv</span></a></li>
'''
a = page.xpath("//li[count>68]/a/text()") # 查询子标签里的count标签里的文本大于68的
[]里还可以放函数
from lxml import etree
html = """<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul>
<li class="item-"> <count>88</count> <a id='i1' href="link.html">first item</a></li>
<li class="item-0"><count>77</count> <a id='i2' href="llink.html">first item2</a></li>
<li class="item-1"><count>66</count> <a href="llink2.html">second item<span>vv</span></a></li>
</ul>
<ul>
<li class="test-"> <count>88</count> <a id='i1' href="link.html">first item</a></li>
<li class="test-0"><count>77</count> <a id='i2' href="llink.html">first item2</a></li>
<li class="test-1"><count>66</count> <a href="llink2.html">second item<span>vv</span></a></li>
</ul> <div><a href="llink2.html">second item</a></div>
</body>
</html>
""" page = etree.HTML(html)
a = page.xpath("//li[starts-with(@class,'test')]/@class") # class以test开头的
print(a) a = page.xpath("//li[contains(@class,'1')]/@class") # class里包含1的
print(a) a = page.xpath("//a[contains(text(),'item2')]/text()") # a标签的内容包含item2的
print(a) # []里的and关系
a = page.xpath("//a[contains(text(),'item2') and @href='llink.html']/text()")
print(a)
其中还包括通配符
*表示任意节点,@*表示任何属性, node()表示任意节点
a = page.xpath("//*/a/text()") # 所有的a标签都选出来了, 不管是div下的a还是li下的a
a = page.xpath("//*/a[@*]/text()") # 这也是所有a, 你要是不服就把@*换成@id
a = page.xpath("//ul/node()") # 里面包括文本节点(换行符之类的)
选取多个路径
a = page.xpath("//ul | //div") # ul或div
轴
轴可定义相对于当前节点的节点集。
语法
轴名称::选择语句
| 轴名称 | 结果 |
| ancestor | 选选取当前节点的所有先辈(父、祖父等)。 |
| ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。 |
| attribute | 选取当前节点的所有属性。 |
| child | 选取当前节点的所有子元素。 |
| descendant | 选取当前节点的所有后代元素(子、孙等)。 |
| descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
| namespace | 选取当前节点的所有命名空间节点 |
| parent | 选取当前节点的父节点。 |
| preceding | 选取文档中当前节点的开始标签之前的所有节点。 |
| preceding-sibling | 选取当前节点之前的所有同级节点。 |
| self | 选取当前节点。 |
| following | 选取文档中当前节点的结束标签之后的所有节点。 |
示例:
就随便来俩吧
a = page.xpath("//ul/child::li") # ul的子标签
a = page.xpath("//ul/li/child::a/attribute::href") # 取到href属性的值
取值
上卖我们一直用text()来取某个标签的文本, 下面来介绍其他几种
通过string取文本
page = etree.HTML(html)
a = page.xpath("string(//ul/li)")
print(a) a = page.xpath("//ul/li")
for i in a:
print(i.xpath("string(.)"))
通过@attr取属性
a = page.xpath("//a/@href")
print(a)
xpath总结的更多相关文章
- xpath提取多个标签下的text
title: xpath提取多个标签下的text author: 青南 date: 2015-01-17 16:01:07 categories: [Python] tags: [xpath,Pyth ...
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...
- 在Java中使用xpath对xml解析
xpath是一门在xml文档中查找信息的语言.xpath用于在XML文档中通过元素和属性进行导航.它的返回值可能是节点,节点集合,文本,以及节点和文本的混合等.在学习本文档之前应该对XML的节点,元素 ...
- XPath 学习二: 语法
XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. 下面列出了最有用的路径表达式: 表达式 描述 nodename 选 ...
- xpath 学习一: 节点
xpath 中,有七种类型的节点: 元素.属性.文本.命名空间.处理指令.注释.以及根节点 树的根成为文档节点或者根节点. 节点关系: Parent, Children, sibling(同胞), A ...
- Python爬虫利器三之Xpath语法与lxml库的用法
前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 Beau ...
- 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...
- 关于robotframework,app,appium的xpath定位问题及常用方法
关于类似的帖子好像很多,但是没有找到具体能帮我解决问题的办法.还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点: 先放一个图: A,先说说不用xpath的场景,一般是用于存在i ...
- Selenium Xpath Tutorials - Identifying xpath for element with examples to use in selenium
Xpath in selenium is close to must required. XPath is element locator and you need to provide xpath ...
- xpath定位中starts-with、contains和text()的用法
starts-with 顾名思义,匹配一个属性开始位置的关键字 contains 匹配一个属性值中包含的字符串 text() 匹配的是显示文本信息,此处也可以用来做定位用 eg //input[sta ...
随机推荐
- java实现单链表逆置
class LNode { public LNode next; public int data; } /*逆置链表*/ class Nizhi { private static LNode head ...
- 前端移动端开发总结(Vue)
上下固定,中间滚动布局(FLEX) <div id="app"> <div class="header"></div> &l ...
- Stm32CubeMX5 创建LED控制工程 - 基于stmf051k8u6
一. 创建一个控制LED的工程 1. 安装好 Stm32CubeMX5 后 打开软件 选择 “ File--> New Project...” 创建一个新工程 2. 之后会出现一个选择芯片的窗 ...
- Windows 下安装 nvm 管理 nodejs 版本
摘自https://segmentfault.com/a/1190000007612011 1. 下载安装与使用 Github: Download nvm-windows --- nvm-setup. ...
- linux下nano命令大全
nano是一个字符终端的文本编辑器,有点像DOS下的editor程序.它比vi/vim要简单得多,比较适合Linux初学者使用.某些Linux发行版的默认编辑器就是nano. nano命令可以打开指定 ...
- MHA-Atlas-MySQL高可用(上)
MHA-Atlas-MySQL高可用(上) 链接:https://pan.baidu.com/s/17Av92KQnJ81Gc0EmxSO7gA 提取码:a8mq 复制这段内容后打开百度网盘手机App ...
- 08-01-json-loggin-模块
复习 ''' ATM: -- start.py BASE_DIR = os.path.dirname(__file__) sys.path.append(BASE_DIR) -- conf -- li ...
- 【转】 MySQL主从(Master-Slave)复制
首先声明:此文是在失去U盘极度郁闷的时候写的,有些零散,估计也有错误.欢迎大家指出 MYSQL服务器复制配置 这是根据我之前看的MYSQL复制的文档然后自己亲自实验的过程.配置的功能比较简单. 环 ...
- Python 内置模块:os模块
Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台.如果是windo ...
- (转)Openfire 中SASL的认证方式之:PLAIN,DIGEST-MD5,anonymous
转:http://blog.csdn.net/coding_me/article/details/39524137 SASL 的认证方式包括: 1. PLAIN:plain是最简单的机制,但 ...