网页内容的解析能够说是爬虫最主要和最核心的工做,从一堆看似杂乱的代码中获取咱们须要的信息,这就是爬虫的本质。html
python对于网页解析提供了不少的方式,传统的即经过urllib2包获取网页代码,再经过re正则表达式模块本身写规则来获取信息。python
第三方的包也有,相似pyquery、lxml、BeautifulSoup。正则表达式
对于单个页面的抓取来讲,上面的3个包都是很适合的,特别是BeautifulSoup,这个包很是的方便,使用期间也很简单。数组
可是scrapy并无直接使用上面的3个包,而是选择本身封装了一层,提供了一个类Selectors,采用XPath的工做原理。scrapy
scrapy本身封装网页处理包的缘由是由于第三方的包,相似BeautifulSoup,在处理大量的网页时效率不高,scrapy主要是基于大规模页面的爬虫处理方案,ide
用 scrapy,咱们能够本身写一个相似百度、360蜘蛛的爬虫,只不过爬行的范围没有那么广而已。url
而Selectors则是针对这个目的开发出来的,下面就其使用方法作一个简单的演示。spa
这里有一段html代码,算是比较标准的,以下:视频
<div class="mainbox"> <div class="hdmenu"> <ul> <li class="s"><a href="http://finance.eastmoney.com/">财经</a></li> <li><a href="http://stock.eastmoney.com/">股票</a></li> <li><a href="http://stock.eastmoney.com/newstock.html">新股</a></li> <li><a href="http://stock.eastmoney.com/gzqh.html">期指</a></li> <li><a href="http://stock.eastmoney.com/chuangyeban.html">创业板</a></li> <li><a href="http://quote.eastmoney.com/" class="red">行情</a></li> <li><a href="http://data.eastmoney.com/">数据</a></li> <li><a href="http://stock.eastmoney.com/global.html">全球</a></li> <li><a href="http://hk.eastmoney.com/">港股</a></li> <li><a href="http://futures.eastmoney.com/">期货</a></li> <li><a href="http://forex.eastmoney.com/">外汇</a></li> <li><a href="http://gold.eastmoney.com/">黄金</a></li> <li><a href="http://fund.eastmoney.com/">基金</a></li> <li><a href="http://money.eastmoney.com/">理财</a></li> <li><a href="http://bank.eastmoney.com/">银行</a></li> <li><a href="http://insurance.eastmoney.com/">保险</a></li> <li><a href="http://bond.eastmoney.com/" target="_blank">债券</a></li> <li><a href="http://video.eastmoney.com/">视频</a></li> <li><a href="http://guba.eastmoney.com/">股吧</a></li> <li><a href="http://fund2.eastmoney.com/">基金吧</a></li> <li><a href="http://blog.eastmoney.com/">博客</a></li> <li><a href="http://t.eastmoney.com/">财迷</a></li> <li><a href="http://so.eastmoney.com/" target="_blank">搜索</a></li> </ul> </div> </div>
这段代码从内到外,有2个div标签,1个ul标签,正常状况下,若是咱们要获取ul标签的内容,能够用以下的方式:xml
sel = HtmlXPathSelector(response) #response即为上面代码的网页相应 ul = sel.select('//ul')
可是,由于一个大的网页里面有不止一个ul,为了特别取这个类别的ul,咱们须要把外面一层的div标记加上,这样就成了:
sel = HtmlXPathSelector(response) #response即为上面代码的网页相应 ul = sel.select('//div[@class="hdmenu"]/ul')
上面的代码执行后,实际上ul即为:
<ul> <li class="s"><a href="http://finance.eastmoney.com/">财经</a></li> <li><a href="http://stock.eastmoney.com/">股票</a></li> <li><a href="http://stock.eastmoney.com/newstock.html">新股</a></li> <li><a href="http://stock.eastmoney.com/gzqh.html">期指</a></li> <li><a href="http://stock.eastmoney.com/chuangyeban.html">创业板</a></li> <li><a href="http://quote.eastmoney.com/" class="red">行情</a></li> <li><a href="http://data.eastmoney.com/">数据</a></li> <li><a href="http://stock.eastmoney.com/global.html">全球</a></li> <li><a href="http://hk.eastmoney.com/">港股</a></li> <li><a href="http://futures.eastmoney.com/">期货</a></li> <li><a href="http://forex.eastmoney.com/">外汇</a></li> <li><a href="http://gold.eastmoney.com/">黄金</a></li> <li><a href="http://fund.eastmoney.com/">基金</a></li> <li><a href="http://money.eastmoney.com/">理财</a></li> <li><a href="http://bank.eastmoney.com/">银行</a></li> <li><a href="http://insurance.eastmoney.com/">保险</a></li> <li><a href="http://bond.eastmoney.com/" target="_blank">债券</a></li> <li><a href="http://video.eastmoney.com/">视频</a></li> <li><a href="http://guba.eastmoney.com/">股吧</a></li> <li><a href="http://fund2.eastmoney.com/">基金吧</a></li> <li><a href="http://blog.eastmoney.com/">博客</a></li> <li><a href="http://t.eastmoney.com/">财迷</a></li> <li><a href="http://so.eastmoney.com/" target="_blank">搜索</a></li>
</ul>
若是咱们要获取ul里面的li列别,便可定义一个变量li,以下:
li = ul.select('//li')
若是咱们是要获取这个特殊的li: <li class="s"><a href="http://finance.eastmoney.com/">财经</a></li>
咱们能够这样写
li = ul.select('//li[@class="s"])
综括号[]里面的@xxx="xxx",即为过滤条件。
咱们若是要获取单个li的文本(即位于<>以外的部分),能够这样写:
li = ul.select('//li') for lli in li: text = lli.select('a/text()').extract()[0]
这里的'a/text()'表示取<a xxx>后面的文本,即text()。
extract方法用于抽取数据,后面跟一个[0]是由于extract方法返回一个数组的结果集,[0]为取其中第一个元素。
若是咱们要获取a href="xxxx"这个后面的连接怎么办呢?
能够这样写:
li = ul.select('//li') for lli in li: text = lli.select('a/@href').extract()[0]
这里a/的后面跟@href即表示在本层次内继续向右查找href,而后获取后面的值。
上面即为Selectors的一些基本用法,其实主要就是从外到内,经过标记外部标签的类名来定位咱们所须要的信息。