简介:
scrapy提取数据最常用的是css选择器,今天学习一下xpath选择器;反正技多不压身。
简单说,xpath就是选择XML文件中节点的方法。
所谓节点node,就是XML文件的最小构成单位,一共分成7种
- element(元素节点)
- attribute(属性节点)
- text (文本节点)
- namespace (名称空间节点)
- processing-instruction (处理命令节点)
- comment (注释节点)
- root (根节点)
最常见就是element(元素节点),所以下面只涉及元素节点的提取
格式
xpath表达式的基本格式
#xpath通过"路径表达式"(Path Expression)来选择节点。
#在形式上,"路径表达式"与传统的文件系统非常类似。
表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
选择节点的基本规则
- nodename(节点名称):表示选择该节点的所有子节点
- "/":表示选择根节点
- "//":表示选择任意位置的某个节点
- "@": 表示选择某个属性
了解3个方面:
一、属性提取;
二、内容提取;
三、标签内包含标签又包含标签的最外层标签里的所有内容提取
一、scrapy xpath 属性提取
目标网址:http://lab.scrapyd.cn/
假设我们需要如图的href地址
①启动scrapy数据提取的调试工具
scrapy shell http://lab.scrapyd.cn/
②介绍一下命令
response.xpath("//ol[@class='page-navigator']//@href")
其中//表示从任意元素节点出发,我们这个选择的ol节点,但是文档那么多ol节点,选择哪一个?,我们观察图上文档,这个ol节点有个class=page-navigator,所以这个是它的一个属性,我们使用@class='page-navigator'选择带有这个属性的ol的节点,然后选择好了节点我们需要提取改节点下的信息,我们需要的是href,所以加上@href。我们先来看看运行效果
图片.png
使用extract()提取纯粹的href,然后在选择第二个
response.xpath("//ol[@class='page-navigator']//@href").extract()[1]
图片.png
二、scrapy xpath 内容提取,表达式: //text()
我们需要下图的内容
图片.png
分析:它是属于quote的,但是quote不是唯一,有很多,所以向上找到container或者row
response.xpath("//div[@class='container']//div[@class='quote post'][1]//span[@class='text']//text()").extract()
注意了
div[@class='quote post']一定要加上post 把这个class 写完
图片.png
图片.png
三、标签内包含标签又包含标签的最外层标签里的所有内容提取
表达式 string()
图片.png
response.xpath("string(//div[@class='container']//div[@class='quote post'][1])").extract()
图片.png
四、xpath实例
路径表达式 结果
/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。
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
- 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
网友评论