笔记-爬虫-XPATH
笔记-爬虫-XPATH
1. xpath
XPath是W3C的一个标准。它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计。目前有XPath1.0和XPath2.0两个版本。其中Xpath1.0是1999年成为W3C标准,而XPath2.0标准的确立是在2007年
XPath 是一门在 XML 文档中查找信息的语言
全称为XML Path Language 一种小型的查询语言
XPath 是一门在 XML 文档中查找信息的语言。
XPath 是 XSLT 中的主要元素。
XQuery 和 XPointer 均构建于 XPath 表达式之上
XPath属于lxml库模块,所以首先要安装库lxml
2. 节点
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
请看下面这个 XML 文档:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
上面的XML文档中的节点例子:
<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)
基本值(或称原子值,Atomic value)
基本值是无父或无子的节点。
项目(Item)
项目是基本值或者节点。
2.1. 节点关系
2.1.1. 父(Parent)
每个元素以及属性都有一个父。
在下面的例子中,book 元素是 title、author、year 以及 price 元素的父:
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
2.1.2.
子(Children)
元素节点可有零个、一个或多个子。
在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
2.1.3.
同胞(Sibling)
拥有相同的父的节点
在下面的例子中,title、author、year 以及 price 元素都是同胞:
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
2.1.4.
先辈(Ancestor)
某节点的父、父的父,等等。
在下面的例子中,title 元素的先辈是 book 元素和 bookstore 元素:
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
2.1.5.
后代(Descendant)
某个节点的子,子的子,等等。
某个节点的子,子的子,等等。
在下面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
3.
XPath 语法
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
3.1.1.
常用的路径表达式:
|
表达式 |
描述 |
实例 |
||||||
|
nodename |
选取nodename节点的所有子节点 |
xpath(‘//div’) |
选取了div节点的所有子节点 |
|||||
|
/ |
从根节点选取 |
xpath(‘/div’) |
从根节点上选取div节点 |
|||||
|
// |
选取所有的匹配节点,不考虑他们的位置 |
xpath(‘//div’) |
选取所有的div节点 |
|||||
|
. |
选取当前节点 |
xpath(‘./div’) |
选取当前节点下的div节点 |
|||||
|
.. |
选取当前节点的父节点 |
xpath(‘..’) |
回到上一个节点 |
|||||
|
@ |
选取属性 |
xpath(’//@calss’) |
选取所有的class属性 |
|||||
3.1.2.
谓语
谓语被嵌在方括号内,用来查找某个特定的节点或包含某个制定的值的节点
|
表达式 |
结果 |
|||
|
xpath(‘/body/div[1]’) |
选取body下的第一个div节点 |
|||
|
xpath(‘/body/div[last()]’) |
选取body下最后一个div节点 |
|||
|
xpath(‘/body/div[last()-1]’) |
选取body下倒数第二个div节点 |
|||
|
xpath(‘/body/div[positon()<3]’) |
选取body下前两个div节点 |
|||
|
xpath(‘/body/div[@class]’) |
选取body下带有class属性的div节点 |
|||
|
xpath(‘/body/div[@class=”main”]’) |
选取body下class属性为main的div节点 |
|||
|
xpath(‘/body/div[price>35.00]’) |
选取body下price元素值大于35的div节点 |
|||
3.1.3.
通配符
Xpath通过通配符来选取未知的XML元素
|
表达式 |
结果 |
||
|
xpath(’/div/*’) |
选取div下的所有子节点 |
||
|
xpath(‘/div[@*]’) |
选取所有带属性的div节点 |
||
|
node() |
匹配任何类型的节点 |
||
3.1.4.
取多个路径
使用“|”运算符可以选取多个路径
|
表达式 |
结果 |
|||
|
xpath(‘//div|//table’) |
选取所有的div和table节点 |
|||
3.1.5.
Xpath轴
轴可以定义相对于当前节点的节点集
|
轴名称 |
表达式 |
描述 |
||||
|
ancestor |
xpath(‘./ancestor::*’) |
选取当前节点的所有先辈节点(父、祖父) |
||||
|
ancestor-or-self |
xpath(‘./ancestor-or-self::*’) |
选取当前节点的所有先辈节点以及节点本身 |
||||
|
attribute |
xpath(‘./attribute::*’) |
选取当前节点的所有属性 |
||||
|
child |
xpath(‘./child::*’) |
返回当前节点的所有子节点 |
||||
|
descendant |
xpath(‘./descendant::*’) |
返回当前节点的所有后代节点(子节点、孙节点) |
||||
|
following |
xpath(‘./following::*’) |
选取文档中当前节点结束标签后的所有节点 |
||||
|
following-sibing |
xpath(‘./following-sibing::*’) |
选取当前节点之后的兄弟节点 |
||||
|
parent |
xpath(‘./parent::*’) |
选取当前节点的父节点 |
||||
|
preceding |
xpath(‘./preceding::*’) |
选取文档中当前节点开始标签前的所有节点 |
||||
|
preceding-sibling |
xpath(‘./preceding-sibling::*’) |
选取当前节点之前的兄弟节点 |
||||
|
self |
xpath(‘./self::*’) |
选取当前节点 |
||||
3.1.6.
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 |
选取id值包含ma和in的div节点 |
||||
|
text() |
xpath(‘//div[contains(text(),”ma”)]‘) |
选取节点文本包含ma的div节点 |
||||
笔记-爬虫-XPATH的更多相关文章
- Scrapy:学习笔记(1)——XPath
Scrapy:学习笔记(1)——XPath 1.快速开始 XPath是一种可以快速在HTML文档中选择并抽取元素.属性和文本的方法. 在Chrome,打开开发者工具,可以使用$x工具函数来使用XPat ...
- 笔记-爬虫-去重/bloomfilter
笔记-爬虫-去重/bloomfilter 1. 去重 为什么要去重? 页面重复:爬的多了,总会有重复的页面,对已爬过的页面肯定不愿意再爬一次. 页面更新:很多页面是会更新的,爬取这种页面时就 ...
- 笔记-爬虫-selenium常用方法
笔记-爬虫-selenium常用方法 1. 查找元素 常用的查找方法 find_element_by_name find_element_by_xpath find_element_by_l ...
- 笔记-爬虫-js代码解析
笔记-爬虫-js代码解析 1. js代码解析 1.1. 前言 在爬取网站时经常会有js生成关键信息,而且js代码是混淆过的. 以瓜子二手车为例,直接请求https://www.guaz ...
- 笔记-爬虫-scrapy-srcapy-redis组件
笔记-爬虫-scrapy-srcapy-redis组件 1. 简介 scrapy是一个爬虫框架,但不支持分布式,scrapy-redis是为了更方便的实现scrapy分布式爬虫的组件. 可以 ...
- 笔记-爬虫-robots.txt
笔记-爬虫-robots.txt 1. robots.txt文件简介 1.1. 是什么 robots.txt是用来告诉搜索引擎网站上哪些内容可以被访问.哪些不能被访问.当搜索引擎访问一 ...
- 笔记-爬虫部署及运行工具-scrapydweb
笔记-爬虫部署及运行工具-scrapydweb 1. 简介 scrapyd是爬虫部署工具,但它的ui比较简单,使用不是很方便. scrapydweb以scrapyd为基础,增加了ui界面和监 ...
- XML学习笔记6——XPath语言
在上一篇笔记的结尾,我们接触到了两个用于选择XML文档中特定范围的元素<selector>和<field>,这两个元素的取值都是XPath表达式,那么,什么是XPath呢?简单 ...
- python爬虫xpath
又是一个大晴天,因为马上要召开十九大,北京地铁就额外的拥挤,人贴人到爆炸,还好我常年挤地铁早已练成了轻功水上漂,挤地铁早已经不在话下. 励志成为一名高级测试工程师的我,目前还只是个菜鸟,难得有机会,公 ...
随机推荐
- css3照片墙
一张张照片散乱的撒在一起,鼠标悬浮时旋转放大并摆正,效果如下图(所有图片均来自网络),主要使用到的css3属性有:transition.transform(scale.rotateZ).box-sha ...
- layui文档阅读进度
2017年1月9日22:13:28已看完layer弹出层部分 2017年1月9日19:15:55http://www.layui.com/doc/modules/layer.html#layer.lo ...
- python定义class
python也是面向对象的语言,类的重要性不言而喻. class Animal: def __init__(self,voice='hello'): self.voice=voice def __de ...
- MSSQL复制分发对异构数据库之间大容量数据分发造成异常
由于历史遗留的问题,现有的架构中存在采用MSSQL的复制分发功能,从Oracle发布数据到MSSQL. 关于这项发布的实现原理,官方表述如下: Oracle 事务发布是通过使用 SQL Server ...
- AD的命名规则 AD常用产品型号命名规则
AD的命名规则 AD常用产品型号命名规则 DSP信号处理器 放大器工业用器件通信 电源管理 移动通信 视频/图像处理器等 模拟A/D D/A 转换器 传感器 模拟器件 A ...
- 实例详解Django的 select_related
在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...
- 【LOJ6043】「雅礼集训 2017 Day7」蛐蛐国的修墙方案(搜索技巧题)
点此看题面 大致题意: 给你一个长度为\(n\)的排列\(p\),要求构造一个合法的括号序列,使得如果第\(i\)个位置是左括号,则第\(p_i\)个位置一定是右括号. 暴搜 很容易想出一个暴搜. 即 ...
- HDU(1698),线段树区间更新
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 区间更新重点在于懒惰标记. 当你更新的区间就是整个区间的时候,直接sum[rt] = c*(r- ...
- Ajax(一):XHR的用法
AJAX能够向服务器请求额外的数据而无须卸载页面,会带来更好的用户体验. 1.在使用xhr对象时,要调用都第一个方法就是open(),它接收3个参数:要发送的请求的类型(get,post等).请求的u ...
- nginx架构分析之 模块化
Nginx涉及到的模块分为核心模块.标准HTTP模块.可选HTTP模块.邮件服务模块以及第三方模块等五大类. 核心模块 核心模块是指Nginx服务器正常运行时必不可少的模块,它们提供了Nginx最基本 ...