上节我们说了怎么从一个网页中获取所有的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> 、 . . . . . . 不用说了吧

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

 

python学习过程(四)的更多相关文章

  1. 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数

    孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 不同类型 ...

  2. 孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成

    孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天经过反复折腾,最终基本上算 ...

  3. 孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数

    孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天打算完成的是通用的(至少目 ...

  4. 孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类尝试第一天

     孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类,尝试第一天 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 按上一天的规划,这是根据过去我自学其它编程语 ...

  5. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

     孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自 ...

  6. 孤荷凌寒自学python第四十四天Python操作 数据库之准备工作

     孤荷凌寒自学python第四十四天Python操作数据库之准备工作 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天非常激动地开始接触Python的数据库操作的学习了,数据库是系统化设计 ...

  7. 孤荷凌寒自学python第四十三天python 的线程同步之Queue对象

     孤荷凌寒自学python第四十三天python的线程同步之Queue对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Queue对象是直接操作队列池的对象,队列中可以存放多种对象,当然也 ...

  8. 孤荷凌寒自学python第四十二天python线程控制之Condition对象

     孤荷凌寒自学python第四十二天python的线程同步之Condition对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天学习了Condition对象,发现它综合了Event对象 ...

  9. 孤荷凌寒自学python第四十天python 的线程锁RLock

     孤荷凌寒自学python第四十天python的线程锁RLock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 因为研究同时在多线程中读写同一个文本文件引发冲突,所以使用Lock锁尝试同步, ...

  10. 孤荷凌寒自学python第四天 安装python的其它IDE环境

    孤荷凌寒自学python第四天 安装python的其它IDE环境 (完整学习过程屏幕记录视频地址在文末) 因为是完全的新手,对python环境搭建完全一无所知,因此,可真是大费周章才配置了其它多个Id ...

随机推荐

  1. 分治思想的应用:C++实现快速排序和随机化的快速排序

    分治思想的应用:C++实现快速排序和随机化的快速排序 原创 2014年09月08日 14:04:49 标签: 快速排序 / 随机化快速排序 / 排序算法 / 数据结构 947 1. 快速排序时冒泡排序 ...

  2. Java-API-Package:java.io

    ylbtech-Java-API-Package:java.io 1.返回顶部 1. Package java.io Provides for system input and output thro ...

  3. mysql查询最近30天、7天、每天、昨天、上个月的记录

      一些变量说明: add_time为插入的时间 to_days是sql函数,返回的是个天数 data_sub(date,INTERVAL expr type)给指定的日期减去多少天 data()函数 ...

  4. ASP.NET 页面生命中的关键事件的执行顺序

    表 1:ASP.NET 页面生命中的关键事件 阶段 页面事件 可覆盖的方法 页面初始化 Init   加载视图状态   LoadViewState 处理回发数据   任意实现 IPostBackDat ...

  5. JS写一个简单的程序,输入两个整数,打印这两个数的和,差,积,余数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. c语言中argc和argv

    main函数的参数,解释如下: argc:命令行总的参数的个数,即argv中元素的格式. *argv[ ]:字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数. argv[0]: ...

  7. Codeforces #345div1 C Table Compression (650C) 并查集

    题意:给你一个n*m的矩阵,需要在不改变每一行和每一列的大小关系的情况下压缩一个矩阵,压缩后的矩阵所有数的总和尽量的小. 思路:我们有这样的初步设想:对于在一行或一列的数x,y,若x<y,则建立 ...

  8. Guava Cache本地缓存

    Guava介绍 Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库. 这个库是为了方便编码,并减少编码错误. 这个库提供用于集合,缓存,支持原语,并发性,常见注解,字 ...

  9. Opencv读取图片像素值并保存为txt文件

    #include <opencv2/opencv.hpp>#include<vector>#include <fstream> using namespace st ...

  10. Win10 VS2013 PCL1.8.1和依赖项VTK8.0.1, QHuall(2.15.2), FLANN1.9.1,Boost1.59.0,Zbil1.2.11和libPNG1.6.34编译安装

    编译和安装过程最好使用管理员权限去操作,避免不必要的错误. 一般而言为了区分Debug和Release库,添加输入变量 Name: CMAKE_DEBUG_POSTFIX Type: STRING V ...