在使用Scrapy框架之前,我们必须先了解它是如何筛选数据的,
Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分
Xpath是专门在XML文件中选择节点的语言,也可以用在HTML上。
CSS是一门将HTML文档样式化语言,选择器由它定义,并与特定的HTML元素的样式相关联。而且这些选择器构造于‘lxml’之上,这就意味着Scrapy框架下的数据筛选有着很高的效率。
基本选择器:
Scrapy爬虫支持多种信息提取的方法:
- Beautiful Soup
- Lxml
- re
- XPath Selector
- CSS Selector
下面我们来介绍Xpath选择器和CSS选择器的使用:
Xpath选择器
-
介绍一下XPath:
XPath 是一门在xml文档中查找信息的语言,它可以在XML文档中对于原色和属性进行遍历。其内置了超过100个内建函数,这些函数用于对字符串值,数值、日期、时间进行比较遍历。总之是一门很方便的语言。
在网络爬虫中,我们只需要利用XPath来采集数据,所以只要掌握一些基本语法,就可以上手使用了。
-
基本使用语法,如下表:
-
实例介绍:
下面我们将以这个book.xml为例子来介绍:
水浒传 施耐庵 58.95 西游记 吴承恩 58.3 三国演义 罗贯中 48.3 红楼梦 曹雪芹 75 -
先将我们需要使用的模块导入(调试环境为ipython):
In [1]: from scrapy.selector import Selector In [2]: body = open('book.xml','r').read() In [3]: print(body)
水浒传 施耐庵 58.95 西游记 吴承恩 58.3 三国演义 罗贯中 48.3 红楼梦 曹雪芹 75 \n\t\t\t \n\t\n' In [5]:\n\t\t\t\t \n\t\t\t水浒传 \n\t\t\t\t施耐庵 \n\t\t\t\t58.95 \n\t\t\t\n\t\t\t\t \n\t\t\t西游记 \n\t\t\t\t吴承恩 \n\t\t\t\t58.3 \n\t\t\t\n\t\t\t\t \n\t\t\t三国演义 \n\t\t\t\t罗贯中 \n\t\t\t\t48.3 \n\t\t\t\n\t\t\t\t \n\t\t红楼梦 \n\t\t\t\t曹雪芹 \n\t\t\t\t75 \n\t\t\t -
下面我们来举几个小例子,说明一下如何通过xpath找到我们想要的数据:
In [5]: print("如果我们要第一个book的内容") 如果我们要第一个book的内容 In [7]: Selector(text=body).xpath('/html/body/bookstore/book[1]').extract() Out[7]: ['
\n\t\t\t\t '] In [8]: print("如果我们要最后一个book的内容") 如果我们要最后一个book的内容 In [9]: Selector(text=body).xpath('/html/body/bookstore/book[last()]').extract() Out[9]: ['水浒传 \n\t\t\t\t施耐庵 \n\t\t\t\t58.95 \n\t\t\t\n\t\t\t\t '] In [10]: print("如果我们要最后一个book的author属性的文本") 如果我们要最后一个book的author属性的文本 In [11]: Selector(text=body).xpath('/html/body/bookstore/book[last()]/author/text()').extract() Out[11]: ['曹雪芹'] In [12]: print("下面是xpath的嵌套使用") 下面是xpath的嵌套使用 In [13]: subbody=Selector(text=body).xpath('/html/body/bookstore/book[3]').extract() In [14]: Selector(text=subbody[0]).xpath('//author/text()').extract() Out[14]: ['罗贯中'] In [15]: Selector(text=subbody[0]).xpath('//book/author/text()').extract() Out[15]: ['罗贯中'] In [16]: Selector(text=subbody[0]).xpath('//book/title/text()').extract() Out[16]: ['三国演义']红楼梦 \n\t\t\t\t曹雪芹 \n\t\t\t\t75 \n\t\t\t在Xpath中最常用的方法大该就是这些了......
-
CSS选择器
-
介绍一下CSS:
和Xpath选择器比起来,感觉CSS选择器容易一些,跟写.css时方法基本一样,就是在获取内容时和Xpath不同,这里需要注意一下。
-
基本使用语法,如下表:
表达式 说明 * 选择所有节点 #container 选择id为container的节点 .container 选择所有class包含container的节点 li a 选取所有li 下所有a节点 ul + p 选取ul后面的第一个p元素 div#container > ul 选取id为container的div的第一个ul子元素 ul ~p 选取与ul相邻的所有p元素 a[title] 选取所有有title属性的a元素 a[href="http://jobbole.com"] 选取所有href属性为http://jobbole.com 的a元素 a[href*="jobbole"] 选取所有href属性值中包含jobbole的a元素 a[href^="http"] 选取所有href属性值中以http开头的a元素 a[href$=".jpg"] 选取所有href属性值中以.jpg结尾的a元素 input[type=radio]:checked 选择选中的radio的元素 div:not(#container) 选取所有id为非container 的div属性 li:nth-child(3) 选取第三个li元素 li:nth-child(2n) 选取第偶数个li元素 -
实例介绍:
下面我们还是以这个book.xml为例子来介绍:
-
上面xpath讲过如何导入模块了,下面我们来举几个小例子,说明一下如何通过css找到我们想要的数据:
In [2]: print("如果我们要所有节点的内容") 如果我们所有节点的内容 In [3]: Selector(text=body).css('*').extract() Out[3]: ['\n\t\n\t\t
\n\t\t\t \n\t\n', '\n\t\t\n\t\t\t\t \n\t\t\t水浒传 \n\t\t\t\t施耐庵 \n\t\t\t\t58.95 \n\t\t\t\n\t\t\t\t \n\t\t\t西游记 \n\t\t\t\t吴承恩 \n\t\t\t\t58.3 \n\t\t\t\n\t\t\t\t \n\t\t\t三国演义 \n\t\t\t\t罗贯中 \n\t\t\t\t48.3 \n\t\t\t\n\t\t\t\t \n\t\t红楼梦 \n\t\t\t\t曹雪芹 \n\t\t\t\t75 \n\t\t\t\n\t\t\t \n\t', '\n\t\t\t\t \n\t\t\t水浒传 \n\t\t\t\t施耐庵 \n\t\t\t\t58.95 \n\t\t\t\n\t\t\t\t \n\t\t\t西游记 \n\t\t\t\t吴承恩 \n\t\t\t\t58.3 \n\t\t\t\n\t\t\t\t \n\t\t\t三国演义 \n\t\t\t\t罗贯中 \n\t\t\t\t48.3 \n\t\t\t\n\t\t\t\t \n\t\t红楼梦 \n\t\t\t\t曹雪芹 \n\t\t\t\t75 \n\t\t\t\n\t\t\t ', '\n\t\t\t\t \n\t\t\t水浒传 \n\t\t\t\t施耐庵 \n\t\t\t\t58.95 \n\t\t\t\n\t\t\t\t \n\t\t\t西游记 \n\t\t\t\t吴承恩 \n\t\t\t\t58.3 \n\t\t\t\n\t\t\t\t \n\t\t\t三国演义 \n\t\t\t\t罗贯中 \n\t\t\t\t48.3 \n\t\t\t\n\t\t\t\t \n\t\t红楼梦 \n\t\t\t\t曹雪芹 \n\t\t\t\t75 \n\t\t\t\n\t\t\t\t ', '水浒传 \n\t\t\t\t施耐庵 \n\t\t\t\t58.95 \n\t\t\t水浒传 ', '施耐庵 ', '58.95 ', '\n\t\t\t\t ', '西游记 \n\t\t\t\t吴承恩 \n\t\t\t\t58.3 \n\t\t\t西游记 ', '吴承恩 ', '58.3 ', '\n\t\t\t\t ', '三国演义 \n\t\t\t\t罗贯中 \n\t\t\t\t48.3 \n\t\t\t三国演义 ', '罗贯中 ', '48.3 ', '\n\t\t\t\t ', '红楼梦 \n\t\t\t\t曹雪芹 \n\t\t\t\t75 \n\t\t\t红楼梦 ', '曹雪芹 ', '75 '] In [4]: print("如果我们要bookstore下的所有内容") 如果我们要bookstore下的所有内容 In [5]: Selector(text=body).css('bookstore book').extract() Out[5]: ['\n\t\t\t\t ', '水浒传 \n\t\t\t\t施耐庵 \n\t\t\t\t58.95 \n\t\t\t\n\t\t\t\t ', '西游记 \n\t\t\t\t吴承恩 \n\t\t\t\t58.3 \n\t\t\t\n\t\t\t\t ', '三国演义 \n\t\t\t\t罗贯中 \n\t\t\t\t48.3 \n\t\t\t\n\t\t\t\t ']红楼梦 \n\t\t\t\t曹雪芹 \n\t\t\t\t75 \n\t\t\t由于book.xml没有元素,只有节点,所以只能列举以上例子,大家可以看到,css选择器比起xpath选择器更为的简洁。
-
好了,以上就是对Scrapy 选择器的介绍以及简单的使用,后面我会慢慢介绍Scrapy框架的具体使用。。。
此文章同时同步到我的个人博客http://www.fkomm.cn/ 谢谢支持