标签:
网页内容的解析可以说是爬虫最主要和最核心的工作,从一堆看似杂乱的代码中获取我们需要的信息,这就是爬虫的本质。
python对于网页解析提供了很多的方式,传统的即通过urllib2包获取网页代码,再通过re正则表达式模块自己写规则来获取信息。
第三方的包也有,类似pyquery、lxml、BeautifulSoup。
对于单个页面的抓取来说,上面的3个包都是很适合的,特别是BeautifulSoup,这个包非常的方便,使用期间也很简单。
但是scrapy并没有直接使用上面的3个包,而是选择自己封装了一层,提供了一个类Selectors,采用XPath的工作原理。
scrapy自己封装网页处理包的原因是因为第三方的包,类似BeautifulSoup,在处理大量的网页时效率不高,scrapy主要是基于大规模页面的爬虫处理方案,
用 scrapy,我们可以自己写一个类似百度、360蜘蛛的爬虫,只不过爬行的范围没有那么广而已。
而Selectors则是针对这个目的开发出来的,下面就其使用方法做一个简单的演示。
这里有一段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标签的内容,可以用如下的方式:
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的一些基本用法,其实主要就是从外到内,通过标记外部标签的类名来定位我们所需要的信息。
标签:
原文地址:http://www.cnblogs.com/oracleblog/p/4292955.html