博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python3爬虫基础-XPth路径语言
阅读量:5746 次
发布时间:2019-06-18

本文共 2494 字,大约阅读时间需要 8 分钟。

hot3.png

简介

XPth,全称XML Path Language,即XML路径语言。可以快速便捷的从XML文档中查找信息的语言,同样适用于HTML文档。

XPth常用规则

路径表达式

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选择孙节点
. 选取当前节点
.. 选取当前节点的父级节点
@ 选取属性
/text() 获取标签对象文本

通配符匹配

通配符 描述
* 匹配任何元素节点
匹配任何属性节点
node() 匹配任何类型的节点

综合示例

# -*- coding:utf8 -*-from lxml import etreetext = """	
第一个div测试标签

测试 P 标签

第二个div测试标签
测试 span 标签
"""html = etree.HTML(text) # 构造 XPth 解析对象# html = etree.parse('./test.html',etree.HTMLParser()) # 读取本地 HTML 方法r = etree.tostring(html).decode('utf8')# etree.tostring() 方法将HTML标签代码修正,补全了示例中未闭合的

标签和加入了标签# 默认显示为bytes类型,后边跟decode转换为utf8格式print("修正后的HTML信息:",r)print("################# 路径获取指定类型节点 ########################")print("获取子级标签对象:" ,html.xpath('/html'))print("获取孙级标签对象:" ,html.xpath('//div'))print("获取指定级别所有标签对象:" ,html.xpath('//*'))print("匹配任何类型的节点:" ,html.xpath('//node()'))print("################## 路径获取节点[按序选择] ######################")print("下标取第一个对象:",html.xpath('//div')[0])print("谓语参数取最后一个对象:",html.xpath('//div[last()]'))print("谓语参数取倒数第二个对象:",html.xpath('//div[last()-1]'))print("################### 获取节点标签对象文本 #######################")print("获取某标签对象文本:" ,html.xpath('//span/text()'))print("####################### 属性获取节点 ###########################")print("匹配所有带属性的标签",html.xpath('//div[@*]//text()'))print("属性获取标签:" ,html.xpath('//div[@class]/text()'))print("属性含值获取标签:" ,html.xpath('//div[@class="test1"]/text()'))print("多属性包含获取标签",html.xpath('//div[contains(@class,"test2")]//text()'))

XPath 轴

轴名称 描述
ancestor 选取当前节点的所有先辈(父、祖父等)
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute 选取当前节点的所有属性
child 选取当前节点的所有子元素
descendant 选取当前节点的所有后代元素(子、孙等)
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
following 选取文档中当前节点的结束标签之后的所有节点
namespace 选取当前节点的所有命名空间节点
parent 选取当前节点的父节点
preceding 选取文档中当前节点的开始标签之前的所有节点
preceding-sibling 选取当前节点之前的所有同级节点
self 选取当前节点

绝对位置路径:

/step/step/...

相对位置路径:

step/step/...

每个步均根据当前节点集之中的节点来进行计算。

步(step)包括:

  • 轴(axis)定义所选节点与当前节点之间的树关系
  • 节点测试(node-test)识别某个轴内部的节点
  • 零个或者更多谓语(predicate)更深入地提炼所选的节点集

步的语法:

轴名称::节点测试[谓语]

示例

例子 结果
child::book 选取所有属于当前节点的子元素的 book 节点。
attribute::lang 选取当前节点的 lang 属性。
child::* 选取当前节点的所有子元素。
attribute::* 选取当前节点的所有属性。
child::text() 选取当前节点的所有文本子节点。
child::node() 选取当前节点的所有子节点。
descendant::book 选取当前节点的所有 book 后代。
ancestor::book 选择当前节点的所有 book 先辈。
ancestor-or-self::book 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)
child::*/child::price 选取当前节点的所有 price 孙节点。

转载于:https://my.oschina.net/zhaojunhui/blog/3051340

你可能感兴趣的文章
最长递增子序列 动态规划
查看>>
原生CSS设置网站主题色—CSS变量赋值
查看>>
webpack 4.0 中 clean-webpack-plugin 的使用
查看>>
python分类
查看>>
GitBlit (1)-- 在linux 安装 GitBlit 并运行
查看>>
程序是如何执行的(一)a=a+1
查看>>
BZOJ - 3578: GTY的人类基因组计划2
查看>>
【http】post和get请求的区别
查看>>
EL表达式无法显示Model中的数据
查看>>
ps6-工具的基础使用
查看>>
linux下使用过的命令总结(未整理完)
查看>>
时间助理 时之助
查看>>
英国征召前黑客组建“网络兵团”
查看>>
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...
查看>>
pyjamas build AJAX apps in Python (like Google did for Java)
查看>>
centos5.9使用RPM包搭建lamp平台
查看>>
Javascript String类的属性及方法
查看>>
[LeetCode] Merge Intervals
查看>>
Struts2 学习小结
查看>>
【记录】JS toUpperCase toLowerCase 大写字母/小写字母转换
查看>>