网站首页 > 技术文章 正文
本篇文章不介绍xpath库的安装和原理,只归纳总结xpath的所有用法
一、基本规则
1. 常用表达式规则
2. 多属性匹配运算符介绍
二、基本用法
1. 初始化对象
html_doc = """
<html>
<head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<ul class="list" id="list-1">
<li class="element"><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list two" id="list-2">
<li class="element"><a href="http://example.com/tillie" class="parent" id="link3">Tillie</a>evan</li>
<li class="element">jane</li>
<li class="element">summer</li>
</ul>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="child" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="parent" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">End...</p>
</body>
</html>
"""
html = etree.HTML(html_doc ) # html文本初始化
# html = etree.parse('./example.html', etree.HTMLParser()) # html文件初始化
2. 补全HTML代码
print(etree.tostring(html).decode('utf-8'))
3. 文本获取
print(html.xpath('//a[@class="parent"]/text()')) # 获取所有a节点内class等于'parent'的文本,返回一个列表
4. 属性获取
print(html.xpath('//ul/@class')) # 获取所有ul节点内的class值,返回一个列表
print(html.xpath('//ul/attribute::*')) # 获取所有ul节点内的所有属性值,返回一个列表
5. 属性匹配
# 属性匹配
print(html.xpath('//ul[@class="list"]')) # 获取所有class等于'list'的ul节点,返回一个列表
# 属性多值匹配
print(html.xpath('//ul[contains(@class, "two")]')) # 获取所有class包含'two'的ul节点,返回一个列表
# 多属性匹配
print(html.xpath('//ul[contains(@class, "two") and @id="list-2"]')) # 满足上面的情况再加上id等于'list-2',返回一个列表
6. 获取所有节点
print(html.xpath('//*')) # 获取所有节点,返回一个列表
print(html.xpath('//li')) # 获取所有的li节点,返回一个列表
7. 获取父 / 祖先节点
print(html.xpath('//li/parent::*')) # 获取所有li节点的直接父节点,返回一个列表
print(html.xpath('//li/..')) # 用法同上
print(html.xpath('//li/ancestor::*')) # 获取所有li节点的祖先节点,返回一个列表
print(html.xpath('//li/ancestor::ul')) # 获取所有li节点的ul祖先节点,返回一个列表
8. 获取子 / 子孙节点
print(html.xpath('//ul/child::*')) # 获取所有ul节点内的直接子节点,返回一个列表
print(html.xpath('//ul/child::li')) # 获取所有ul节点内的li直接子节点,返回一个列表
print(html.xpath('//ul/li')) # 用法同上
print(html.xpath('//ul/descendant::*')) # 获取所有ul节点内的子孙节点,返回一个列表
print(html.xpath('//ul/descendant::a')) # 获取所有ul节点内的a子孙节点,返回一个列表
print(html.xpath('//ul//a')) # 用法同上
9. 获取兄弟 / 后续节点
print(html.xpath('//li[1]/following-sibling::*')) # 获取所有li[1]节点之后的兄弟节点,返回一个列表
print(html.xpath('//li[1]/following::*')) # 获取所有li[1]节点的后续节点,返回一个列表
print(html.xpath('//li[1]/following::*[2]')) # 获取所有li[1]节点后的第二个节点,返回一个列表
10. 按序选择(正序位置是从1开始,last()-2 代表倒数第三个位置,因为last()是最后一个)
print(html.xpath('//ul/li[1]')) # 获取所有ul节点内的第一个li节点,返回一个列表
print(html.xpath('//ul/li[last()]')) # 获取所有ul节点内的最后一个li节点,返回一个列表
print(html.xpath('//ul/li[last()-2]')) # 获取所有ul节点内的倒数第三个li节点,返回一个列表
print(html.xpath('//ul/li[position()<3]')) # 获取所有ul节点内位置小于3的li节点,返回一个列表
猜你喜欢
- 2024-11-14 Playwright自动化测试工具之元素定位实战
- 2024-11-14 利器 | AppCrawler 自动遍历测试实践(二):定制化配置
- 2024-11-14 java组件HuTool相关工具类的使用二
- 2024-11-14 手把手教你爬取热门小说《诡秘之主》
- 2024-11-14 怎么用xpath写drissionpage?或者用相对位置?
- 2024-11-14 通过python+Xpath实现抓取某网站推荐的歌曲
- 2024-11-14 Python自动化工具(python写自动化工具)
- 2024-11-14 web自动化测试——xpath常用案例(web自动化测试平台)
- 2024-11-14 手把手教你如何用Python爬取网站文本信息
- 2024-11-14 史上最全 Appium 自动化测试从基础到框架实战精华学习笔记(一)
- 最近发表
-
- count(*)、count1(1)、count(主键)、count(字段) 哪个更快?
- 深入探索 Spring Boot3 中 MyBatis 的 association 标签用法
- js异步操作 Promise fetch API 带来的网络请求变革—仙盟创梦IDE
- HTTP状态码超详细说明_http 状态码有哪些
- 聊聊跨域的原理与解决方法_跨域解决方案及原理
- 告别懵圈!产品新人的接口文档轻松入门指南
- 在Javaweb中实现发送简单邮件_java web发布
- 优化必备基础:Oracle中常见的三种表连接方式
- Oracle常用工具使用 - AWR_oracle工具有哪些
- 搭载USB 3.1接口:msi 微星 发布 990FXA Gaming 游戏主板
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)