上节我们说了怎么从一个网页中获取所有的a标签,包括a标签的文本和a标签的url,以及最后经过整理,直接从网页中获取key-value键值对,也就是标签:url这种形式。

例如 : 百度: http://www.baidu.com

在此基础,我们还可以做一些模糊筛选,将我们感兴趣的所有标签查找初来,供进一步爬虫分别爬取各个页面。今天,我们就是来做的事情就是把页面中的文本内容取出来,

类似的效果比如是这样的:

                                    

下面我们就一步步来实现这个过程:

首先是我们做的事情是导入一个类工具,对应的代码可以和我照着这么写就可以了:

import urllib2
import re
from sgmllib import SGMLParser

导入了这个东西以后,我们就可以来创建我们自己的类来继承这个类,到时候里面的很多方法会很有用哦. . .

看看我们的类是什么样的:

class GetIdList(SGMLParser):  #此处定义一个自己的类,叫作GetIdList,它肯定要继承SGMLParser啦
def reset(self):
self.IDlist = [] #这就是最后返回给我们的结果,先是空的
self.flag = False #这就是一个做标记的作用,默认开始是False
self.getdata=False #这也是标志作用,是否开始获取数据
self.verbatim = 0
SGMLParser.reset(self) def start_div(self,attrs): #表示遇到了一个div的开始,也就是碰到了<div>
if self.flag == True:
self.verbatim +=1 #进入子层div
return
for k,v in attrs: #我的理解就是attrs包含了class的信息,如果是碰到了我感兴趣的,
if k =='class' and v =='entry-content': #这里entry-content是根据自己网页改,看你自己对哪个感兴趣
self.flag=True
return def end_div(self): #表示结束div,碰到</div>
if self.verbatim ==0:
self.flag=False
if self.flag == True:
self.verbatim -=1 def start_p(self,attrs): #碰到p标签开始
if self.flag == False:
return
self.getdata=True #可以获取数据 def end_p(self):#遇到</p> #碰到p标签结束,
if self.getdata:
self.getdata = False #停止获取数据啦 def handle_data(self, text):#处理文本
if self.getdata:
self.IDlist.append(text) #把我获取到的数据加到list中 def printID(self): #这里就是打印出获取到的结果并返回
for i in self.IDlist:
print i
return self.IDlist

类写好了,怎么去用呢??用时需要条件嘛,现在只是一个类,我们要对它实例化,学过java的知道,我们没有对象,去new一个就可以了嘛,

有了这个类的实例,你还有给我网页的文本嘛,也就是html源码嘛,前面我们说了怎么从网络上获取html,这里我们就开头图上说的那个静态的字符串

好了,看代码怎么去操作这个html,解析出我们想要的数据:

def printText(html):
lister = GetIdList() #创建实例,这里可千万别说new一个
lister.feed(html) #提供我们的html
l = lister.printID() #开始打印输出吧 printText(the_page)

这样,我们就把网页中感兴趣的div内容取出了,看结果:

啊?为什么最头上的<a></a>怎么没有,而<p><a href="http://www.baidu.com">感兴趣内容里面的a标签</a></p>却有呀,

因为前面123直接在div下,而感兴趣内容里面的a标签在P标签下,仔细看我们设计的类里,因为后者在p标签下,为了也获取前者123,我们完全可以在类里加这么两个函数

来获取a标签的123,看图:

加了start_a和end_a,就可以获取到了我们div下的<a>123</a>了,那么我还想获取 <h1>  、<table>  、<ul> 、 . . . . . . 不用说了吧

接下来是不是可以获取到我感兴趣的一切啦?还在等什么,赶紧行动起来吧!!!

 

最新文章

  1. Unity3D 5.x 简单实例 - 脚本编写
  2. MYSQL5.7版本sql_mode=only_full_group_by问题
  3. 详解spring 每个jar的作用
  4. 支付宝微信O2O大战,WiFi广告在夹缝中求生存
  5. jq实现多banner效果图
  6. MyEclipse 8.5 开发环境配置,汉化,Aptana2.0插件,SVN 插件,Flex Builder 3/4 插件安装(转载)
  7. 【HDU 4352】 XHXJ&#39;s LIS (数位DP+状态压缩+LIS)
  8. C语言简单strcat和strcmp的实现
  9. title:EL表达式获取Map里面的数值失败的问题
  10. PBOC圈存时用到3DES加密解密以及MAC计算方法
  11. 奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示
  12. 在c:forEach与s:iterator里面使用if标签判断当前位置是否为2的倍数
  13. sys.argv[]使用
  14. 洛谷P1126 机器人搬重物【bfs】
  15. day26 第二阶段共享
  16. C语言基础第五次作业
  17. c++中冒号(:)和双冒号(::)的用法
  18. Jdbc druid数据库连接池
  19. ubuntu 访问 共享 windows文件夹
  20. sql中table用法

热门文章

  1. Jmeter 分布式压测及可能出现的问题;
  2. C# 获取图片某像素点RGB565值
  3. TP-Link WR703N OpenWRT固件修改WAN LAN排序
  4. SetConsoleCtrlHandler演示
  5. UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xe5 in position 85
  6. js中的执行环境和作用域链
  7. 使用setTimeout 来实现setInterval的效果
  8. oracle 在xml中批量插入,批量修改及多组条件查询
  9. java之控制多幅图片
  10. 修改linux内核启动logo及显示位置