Xpath

Zss 发表于:

全称为XML Path Language 一种小型的查询语言
说道XPath是门语言,不得不说它所具备的优点:
1) 可在XML中查找信息 2) 支持HTML的查找 3) 通过元素和属性进行导航

首先介绍下xpath的几个支持的地方,chrome的f12中,ctrl+F的查找中是支持xpath的语法的,但是这里使用起来不是特别方便

在lxml库中也可以使用到xpath:

XPath的简单调用方法:

from lxml import etree
selector=etree.HTML(源码)  #将源码转化为能被XPath匹配的格式
selector.xpath(表达式)  #返回为一列表

还有一个就是chrome的插件,叫做xpath helper,这个插件是非常好用的,可以在谷歌的商店中找到,不过需要翻墙才能下载,这里下载了一个安装包

—— >>>xpathhelper_downcc

1.点击 Ctrl + Shift + X 激活 XPath Helper的控制台,然后您可以在 Query 文本框中输入相应 XPath 进行调试了,提取的结果将被显示在旁边的 Result 文本框中

2.按住Shift键鼠标在页面上的元素。查询框会不断更新,以显示鼠标指针下面的元素充分XPath查询。结果框其右侧将显示评价结果的查询。

3.如果需要的话,可以直接在控制台编辑XPath查询。在结果框中将立即反映任何变化。

4.再次按Ctrl-Shift键-X关闭控制台

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集,简单来说可以用来定位页面中的元素,包括这些元素的的各个信息,写爬虫的时候是一个不错的选择

例子一://*[@id=”maincontent”]/div[4]/table[1]/tbody/tr/td[1]

解释:选择所有id名为”maincontent”下第四个div标签下的第一个table标签下的tbody下的tr标签的第一个td标签

因为tr标签存在多个,所以会将tbody下的所有的tr标签全部选择再一次选择他们的第一个td标签

例子二://*[@id=”kw” and @name=”wd” or @class=”s_ipt”]/text()

解释:选择所有id属性为kw而且name属性为wd  或者  class属性为s_ipt的元素的文本信息

重点:and  or   text()的使用

例子三://*[@id=”kw”]/@name | //*[@name=”sw”]/@id | //*[@id=”cw”]/@class

解释:选择所有id属性为kw的元素的name属性的值   和   所有name属性为sw的元素的id属性的值  和  所有id属性为cw的元素的class属性的值

重点:获取元素的某个属性的值:@      在selenium中的xpath使用的是.get_attribute(“href”)的方法   而不能直接使用@来获取

多条xpath语句的组合:    |    可以选取若干个路径

例子四://div[starts-with(@id,”a”)]/text()

解释:这里使用starts-with方法提取div的id标签属性值开头为a的div标签

 

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

 

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。
运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有拥有 book 和 cd 元素的节点集
+ 加法 6 + 4 10
减法 6 – 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80 如果 price 是 9.80,则返回 true。

如果 price 是 9.90,则返回 false。

!= 不等于 price!=9.80 如果 price 是 9.90,则返回 true。

如果 price 是 9.80,则返回 false。

< 小于 price<9.80 如果 price 是 9.00,则返回 true。

如果 price 是 9.90,则返回 false。

<= 小于或等于 price<=9.80 如果 price 是 9.00,则返回 true。

如果 price 是 9.90,则返回 false。

> 大于 price>9.80 如果 price 是 9.90,则返回 true。

如果 price 是 9.80,则返回 false。

>= 大于或等于 price>=9.80 如果 price 是 9.90,则返回 true。

如果 price 是 9.70,则返回 false。

or price=9.80 or price=9.70 如果 price 是 9.80,则返回 true。

如果 price 是 9.50,则返回 false。

and price>9.00 and price<9.90 如果 price 是 9.80,则返回 true。

如果 price 是 8.50,则返回 false。

mod 计算除法的余数 5 mod 2 1