之前介绍了利用Beautiful Soup、pyquery以及正则表达式来提取网页数据,这确实非常方便。而Scrapy本身提供了自己的数据提取方法,即Selector(选择器)。Selector是基于lxml来构建的,支持XPath选择器、CSS选择器以及正则表达式,功能全面,解析速度和准确度非常高。我们来具体的了解一下。
1.直接使用
Seletor是一个可以独立使用的模块。我们可以直接利用Selector这个类来构建一个选择器对象,然后调用它的相关方法如xpath()、css()等来提取数据。
比如,针对一段HTML代码,我们可以用如下方式构建Selector对象来提取数据:
from scrapy import Selector
body = '<html><head><title>Hello World</title></head><body></body></html>'
selector = Selector(text=body)
title = selector.xpath('//title/text()').extract_first()
print(title)
运行结果如下:
Hello World
我们这里没有在Scrapy框架中运行,而是把Scrapy中的Selector单独拿出来使用了,构建的时候传入了text参数,就生成了一个Selector选择器对象,然后就可以像前面我们所用的Scrapy中的解析方式一样,调用xpath()、css()等方法来提取了。
在这里我们查找的是源代码中的title中的文本,在Xpath选择器最后加上text()方法就可以是想文本的提取了。
以上内容就是Selector的直接使用方式。Beautiful Soup等库类似,Selector其实也是强大的网页解析库。如果方便的话,我们也可以在其他项目中直接使用Selector来提取数据。
2.Scrapy shell
由于Selector主要是与Scrapy的结合使用,如Scrapy的回调函数中的参数response直接调用xpath()或者css()方法来提取数据,所以我们在这里借助Scrapy shell来模拟Scrapy请求的过程,来学习相关的提取方法。
我们用官方文档的一个样例页面来做演示:http://doc.scrapy.org/en/latest/_static/selectors-sample1.html
开启Scrapy shell,在命令行输入如下命令:
scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html
我们就进入到Scrapy shell模式。这个过程其实是,Scrapy发起了一次请求,请求的URL就是刚才命令行下输入的URL,然后把一些可操作的变量传递给我们,如request、response等。我们可以在命令行模式下输入命令调用对象的一些操作方法,回车之后实时显示结果。这与Python的命令行交互模式是类似的。
接下来演示的实例都将页面的源码作为分析目标,页面源代码如下:
<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
<a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
<a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
<a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
<a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
</div>
</body>
</html>