您的位置:首页 > 其它

Scrapy1.5 第三章 选择器(selector)

2018-03-05 07:43 295 查看
    当你爬取网页的时候,你最常做的工作一定是提炼你抓到的网页,通常来说,我们用美味汤,或者lxml来完成这项工作。前者虽然各种意义上都很强,但是唯有一个缺点——太慢了。
    Scrapy有他自己的一套选择器,基于xpath和css。Xpath选择器用于在XML文档中选择代码,而CSS选择器用于HTML文档。

    Scrapy选择器是基于lxml库的,这意味这它兼顾了简洁与快速。

一、建构选择器
    Scrapy选择器是Selector类的实例,由文本或者TextResponse对象构筑。它会自动挑选相对于比较好的解析方法(在xml和HTML中),当然,这是基于输入类型的。
 
>>> from scrapy.selector import Selector
>>> from scrapy.http import HtmlResponse    当然,也可以解析一串文本:>>> body = '<html><body><span>good</span></body></html>'
>>> Selector(text=body).xpath('//span/text()').extract()
[u'good']    从response中作解析:>>> response = HtmlResponse(url='http://example.com', body=body)
>>> Selector(response=response).xpath('//span/text()').extract()
[u'good']   二、使用选择器
    为了解释选择器,我们将会使用Scrapy Shell(一个用来提供交互式测试的东西)来进行讲解,目标网页是:https://doc.scrapy.org/en/latest/_static/selectors-sample1.html(这是个用于测试的实验网站,请大胆的进行尝试!)。

    为了便利各位,贴出上面那个网站的HTML代码:<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>    首先,打开shell,输入以下命令(看不懂这条命令,赶紧回去看第二章):scrapy shell https://doc.scrapy.org/en/latest/_static/selectors-sample1.html    加载完shell之后,就让我们开始着手处理HTML数据吧。我们先构筑一条能够获得title标签内内容的xpath表达式。
>>> response.selector.xpath('//title/text()')
[<Selector (text) xpath=//title/text()>]
    使用xpath或者css也可以用另外的更简单的办法——response.xpath()和response.css():>>> response.xpath('//title/text()')
[<Selector (text) xpath=//title/text()>]
>>> response.css('title::text')
[<Selector (text) xpath=//title/text()>]    如你所见,我们的选择器并没有返回实际的值,只是返回了一个SelectorList实例。如果你的眼神足够犀利的话,就会立马从这个实例名称中发现,这个实例是一个包含了selector的列表。>>> response.css('img').xpath('@src').extract()
[u'image1_thumb.jpg',
u'image2_thumb.jpg',
u'image3_thumb.jpg',
u'image4_thumb.jpg',
u'image5_thumb.jpg']    selector有一个叫做extract的方法,用来提取一些文本,就像下面展示的一样:>>> response.xpath('//title/text()').extract()
[u'Example website']如果你只想要第一个元素,那么就用extract_first()吧。当然,当根本找不到指定的元素的时候,这个方法就会返回None
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: