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总结的更多相关文章

  1. xpath提取多个标签下的text

    title: xpath提取多个标签下的text author: 青南 date: 2015-01-17 16:01:07 categories: [Python] tags: [xpath,Pyth ...

  2. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

    第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...

  3. 在Java中使用xpath对xml解析

    xpath是一门在xml文档中查找信息的语言.xpath用于在XML文档中通过元素和属性进行导航.它的返回值可能是节点,节点集合,文本,以及节点和文本的混合等.在学习本文档之前应该对XML的节点,元素 ...

  4. XPath 学习二: 语法

    XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. 下面列出了最有用的路径表达式: 表达式 描述 nodename 选 ...

  5. xpath 学习一: 节点

    xpath 中,有七种类型的节点: 元素.属性.文本.命名空间.处理指令.注释.以及根节点 树的根成为文档节点或者根节点. 节点关系: Parent, Children, sibling(同胞), A ...

  6. Python爬虫利器三之Xpath语法与lxml库的用法

    前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 Beau ...

  7. 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接

    使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...

  8. 关于robotframework,app,appium的xpath定位问题及常用方法

    关于类似的帖子好像很多,但是没有找到具体能帮我解决问题的办法.还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点: 先放一个图: A,先说说不用xpath的场景,一般是用于存在i ...

  9. 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 ...

  10. xpath定位中starts-with、contains和text()的用法

    starts-with 顾名思义,匹配一个属性开始位置的关键字 contains 匹配一个属性值中包含的字符串 text() 匹配的是显示文本信息,此处也可以用来做定位用 eg //input[sta ...

随机推荐

  1. ASE——第一次结对作业

    ASE--第一次结对作业 问题定义 很早就听说了MSRA的黄金点游戏,让大家写Bot来参加比赛看谁的AI比较聪明可以操盘割韭菜.深感ASE课程老师设计的任务太用心了,各种接口都准备好了,大家只用专注于 ...

  2. MYSQL增量备份与恢复

    vim /etc/my.cnf在[mysqld]下添加max_binlog_size = 1024000 //二进制日志最大1M 要进行mysql的增量备份,首先要开启二进制日志功能方法一:在/etc ...

  3. Django过滤器之safe

    safe除了将html生成安全的文本外,还有将整型转为字符串: {% for user in user_list %} {% if user.id|safe == uid %} <li clas ...

  4. promise、async、await、settimeout异步原理与执行顺序

    一道经典的前端笔试题,你能一眼写出他们的执行结果吗? async function async1() { console.log("async1 start"); await as ...

  5. Jmeter关联之正则表达式提取器(完整版)

    Jmeter关联之正则表达式提取器(完整版)   在性能测试中,若想提取上一个请求的结果,作为下一次请求的参数,则需要使用关联~ 这篇博客主要讲jmeter正则表达式提取器的各种用法. 首先正则表达式 ...

  6. 高性能js之js文件的加载与解析

    随着网站的发展,现在的网页已经离不开js,经常一个页面会引入大量的js.那么该如何合理的加载这些js? head标签中引入js文件可能是最常见的一种方式,但是这样会造成一个问题.因为j可以说是浏览器中 ...

  7. cookie和session 的初步介绍

    Cookie和Session http协议不保存用户状态(信息) Cookie和Session都是为了能够保存用户信息 Cookie: 本质:保存在浏览器上的键值对 用途:标识当前用户信息 cooki ...

  8. 【LeetCode 18】四数之和

    题目链接 [题解] 两重循环枚举[i..j]这个区间 同时规定必取nums[i]和nums[j] 那么现在的问题就变成在下标为[i..j]这个区间的数字里面找两个数字使他们的和为target-nums ...

  9. Android onActivityResult()运行时刻的问题

    今天在开发过程中遇到一个很是怪异的问题,就是方法onActivityResult的执行问题,问题是当我从当前的Activity跳转的时候,尚未做任何动作,onActivityResult()就已经执行 ...

  10. Linux环境安装PHP链接SQLserver2008

    网上很多介绍,但是跟着做总是有问题,找到一个大神的,没出现过问题: 1.首先需要编译安装FreeTDS 1.1.安装 说明:一定要从官网下载最新的版本FreeTDS-0.95 ftp://ftp.fr ...