python 爬虫部分解释
example:self.file = www.baidu.com存有baidu站的index.html
def parseAndGetLinks(self): # parse HTML, save links
self.parser = HTMLParser(AbstractFormatter(DumbWriter(StringIO())))
self.parser.feed(open(self.file).read())
self.parser.close()
return self.parser.anchorlist
*******************@先搜一下伙伴们的成果*****************************
HTMLParser(AbstractFormatter(DumbWriter(StringIO))) ”’ 使用HTMLParser的方法进行处理,StringIO是从内存中读取数据,DumbWriter将事件流转换为存文本文档”’
主要是AbstractFormatter 查了下相关资料
formatter 模块提供了一些可用于 htmllib 的格式类( formatter classes ).
这些类有两种, formatter 和 writer . formatter 将 HTML 解析器的标签和数据流转换为适合输出设备的事件流( event stream ), 而 writer 将事件流输出到设备上.
大多情况下, 你可以使用 AbstractFormatter 类进行格式化. 它会根据不同的格式化事件调用 writer 对象的方法. AbstractWriter 类在每次方法调用时打印一条信息.
HTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。
HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它
主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然
后重新定义这几个以handler_开头的函数即可。这几个函数包括:
handle_startendtag 处理开始标签和结束标签
handle_starttag 处理开始标签,比如<xx>
handle_endtag 处理结束标签,比如</xx>
handle_charref 处理特殊字符串,就是以&#开头的,一般是内码表示的字符
handle_entityref 处理一些特殊字符,以&开头的,比如
handle_data 处理数据,就是<xx>data</xx>中间的那些数据
handle_comment 处理注释
handle_decl 处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
handle_pi 处理形如<?instruction>的东西
这里我以从网页中获取到url为例,介绍一下。要想获取到url,肯定是要分析<a>标签,然后取到它的href属性的值。下面是代码:
import HTMLParser
class MyParser(HTMLParser.HTMLParser):
def __init__(self):
HTMLParser.HTMLParser.__init__(self)
def handle_starttag(self, tag, attrs):
# 这里重新定义了处理开始标签的函数
if tag == ‘a’:
# 判断标签<a>的属性
for name,value in attrs:
if name == ‘href’:
print value
if __name__ == ‘__main__’:
a = ‘<html><head><title>test</title><
body><a href=”http://www.163.com”>链接到163</a></body&
gt;</html>’
my = MyParser()
# 传入要分析的数据,是html的。
my.feed(a)
class HTMLParser.HTMLParser:使用HTMLParser 的实例,填充HTML数据,并在开始和结束标记间调用函数.HTMLParser类意味着重载.和 htmllib 的分析器不同,this parser并不检测和开始标记对应的结束标记
HTMLParser 实例有如下的方法:
HTMLParser.reset() #重置实例.所有未处理的数据都会丢失.在初始化时自动调用.
HTMLParser.feed(data) #给分析器喂食.在由完整元素构成的情况下工作;不完整数据情况下,会进行缓冲知道更多数据加进来或者 close() 被调用.
HTMLParser.close() #处理所有缓冲数据.这个方法可以被派生类重定义,以便在输入结束后处理额外的事情,重定义的版本也要调用 HTMLParser 基类的 close() 方法.
HTMLParser.getpos() #返回当前行数和列数
HTMLParser.get_starttag_text() #返回最近打开过得开始标记处的文本.通常不会用到
HTMLParser.handle_starttag(tag, attrs)
#该方法用来处理一个标记的开始.tag参数是tag的名字的小写化.attrs参数是一个list,由(name,value)组成,反映
了<>里面的属性. name会被翻译成小写字母,在value中的引号也被移除了,字符实体引用也会被替换.例如,有个 tag<A
HREF=”http://www.cwi.nl/”> ,那么使用该方法就该这么做: handle_starttag(‘a’,
[('href','http://www.cwi.nl/')])
HTMLParser.handle_startendtag(tag, attrs) #和handle_starttag()类似,用来处理XHTML风格的空标签(<a …/>).可能被子类重载
HTMLParser.handle_endtag(tag) #该方法用来处理元素结束标记.可以被派生类重载;基类什么也不做. tag参数是tag的name转化来的小写字母.
HTMLParser.handle_data(data) #该方法用来处理随机的数据.
HTMLParser.handle_charref(name) #处理 &#ref 格式的字符引用.
HTMLParser.handle_entityref(name) #处理一般的 &name 格式的实体引用. name 是一个一般的实体引用.
HTMLParser.handle_comment(data) #处理遇到注释的情况.注释参数为在——和——之间的字符串文本,而不是分隔符自身.例如 <!–text–> ,该方法将调用’text’.
HTMLParser.handle_decl(decl) #当分析器遇到SGML声明时调用此方法. decl 参数是 <!…> 标记里的整个内容.
HTMLParser.handle_pi(data) #处理命令, data 参数包含整个的处理命令.例如 <?proc color=’red’> ,该方法应写成 handle_pi(“proc color=’red’”).
使用实例:
#!/usr/bin/python #-*- encoding: utf-8 -*- import HTMLParserclass MyParser(HTMLParser.HTMLParser): def __init__(self): HTMLParser.HTMLParser.__init__(self) def handle_starttag(self, tag, attrs): # 这里重新定义了处理开始标签的函数 if tag == ‘a’: # 判断标签<a>的属性 for name,value in attrs: if name == ‘href’: print value if __name__ == ‘__main__’: a = ‘<html><head><title>test</title><body><a href=”http: //www.163.com”>链接到163</a><a href=”http://www.linuxqq.net“>焦点</a></body></html>’ my = MyParser() # 传入要分析的数据,是html的。 my.feed(a) |
运行结果:
http: //www.163.com
http://www.linuxqq.net
handle_starttag 处理开始标签,比如<xx>
handle_endtag 处理结束标签,比如</xx>
handle_charref 处理特殊字符串,就是以&#开头的,一般是内码表示的字符
handle_entityref 处理一些特殊字符,以&开头的,比如
handle_data 处理数据,就是<xx>data</xx>中间的那些数据
handle_comment 处理注释
handle_decl 处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
handle_pi 处理形如<?instruction>的东西
本文出自 小Q哥,转载时请注明出处及相应链接。
*************************************************************************************************
python 爬虫部分解释的更多相关文章
- [python]爬虫学习(一)
要学习Python爬虫,我们要学习的共有以下几点(python2): Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy ...
- [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍
前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...
- 【Python爬虫】入门知识
爬虫基本知识 这阵子需要用爬虫做点事情,于是系统的学习了一下python爬虫,觉得还挺有意思的,比我想象中的能干更多的事情,这里记录下学习的经历. 网上有关爬虫的资料特别多,写的都挺复杂的,我这里不打 ...
- python 爬虫抓取心得
quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quo ...
- Python爬虫学习:二、爬虫的初步尝试
我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...
- python爬虫 - Urllib库及cookie的使用
http://blog.csdn.net/pipisorry/article/details/47905781 lz提示一点,python3中urllib包括了py2中的urllib+urllib2. ...
- python爬虫Scrapy(一)-我爬了boss数据
一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴. ...
- Python爬虫实例:爬取猫眼电影——破解字体反爬
字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...
- python爬虫学习视频资料免费送,用起来非常666
当我们浏览网页的时候,经常会看到像下面这些好看的图片,你是否想把这些图片保存下载下来. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片点击鼠标右键的时候并没有另存为选项,或者你可以通过截图工 ...
随机推荐
- OpenStack 组成 架构
Components of OpenStack OpenStack is on a mission: to provide scalable, elastic cloud computing for ...
- 从0开始整合SSM框架--3.整合SpringMvc
前面面已经完成了2大框架的整合,SpringMVC的配置文件单独放,然后在web.xml中配置整合.1.配置spring-mvc.xml <beans xmlns="http://ww ...
- [转]Getting started with ASP.NET Web API OData in 3 simple steps
本文转自:https://blogs.msdn.microsoft.com/webdev/2013/01/29/getting-started-with-asp-net-web-api-odata-i ...
- flex的使用以及布局 转载
转 : http://www.cnblogs.com/waisonlong/p/6055020.html flex的使用以及布局 1.添加flex属性后的区别 1 2 3 4 5 6 7 8 9 ...
- [Linux]C语言Linux系统编程创建进程
1.进程ID 每一个进程都由一个唯一的标识符表示,即进程ID,简称pid.系统保证在某时刻每个pid都是唯一的. 1.1分配进程ID 缺省情况下,内核将进程ID的最大值限制为32768,可以在此处设置 ...
- Java代码生成图片验证码
1.jsp页面显示验证码,src跳转到Controller里的:getImg_validate,reloadImg()作用是点击验证码就会换一张(重新请求getImg_validate) <ul ...
- mysql随机查询符合条件的几条记录
随机查询,方法可以有很多种.比如,查询出所有记录,然后随机从列表中取n条记录.使用程序便可实现.可是程序实现必须查询出所有符合条件的记录(至少是所有符合条件的记录id),然后再随机取出n个id,查询数 ...
- hdu 1159(DP+字符串最长公共序列)
http://blog.csdn.net/a_eagle/article/details/7213236 公共序列可以用一个二维数组dp[i][j]保存每个点时的最大数字,本质就是一个双向比较. dp ...
- K:hash的应用场景
本博文主要用于讲解Hash的应用场景 Hash主要应用于数据结构中和密码学中. 用于数据结构时,主要是为了提高查询的效率,这就对速度比较重视,对抗碰撞不太看中,只要保证hash均匀分布就可以. 在密码 ...
- csharp: using wininet.dll
/// <summary> /// Windows Embedded CE 6.0 R3 WinInet Functions /// https://technet.microsoft.c ...