- 浏览: 307039 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (69)
- python (31)
- android (1)
- 软件安装 (3)
- 运维监控 (5)
- pycurl (1)
- RFC (0)
- RFC,IRC,翻译 (1)
- ubuntu 打开 22端口 (1)
- redis (3)
- 缓存 (1)
- 多进程,共享数据,通信, (1)
- django (4)
- cookie (1)
- session (1)
- nodejs npm (1)
- mongodb (2)
- tornado (2)
- 异步 (1)
- seo (0)
- seo,错误,笔记 (1)
- sysv-rc-conf (1)
- ubuntu (2)
- 开机启动 (1)
- supervisor (1)
- 进程 (1)
- twitter tweepy (1)
- Bootstrap (1)
- Bootstrap-maxlength (1)
- 微信 (1)
- 公共号 (1)
- 框架 (1)
- mac,virtualbox,xp (1)
- beef (1)
- ruby1.8 (1)
- ruby1.9 (1)
- rvm (1)
- subline (1)
- egret (1)
- ssl (1)
最新评论
-
koreyoshi:
那要是周排名月排名呢
redis set轻松做排行榜应用 -
xuddk727:
仁兄能否将affinity_0.1.0发我一份?在我这该网站无 ...
python 绑定进程在某个cpu上执行-affinity -
mimicom:
wifi 调试 adb shell 的话 是 transpor ...
android adb shell 笔记 -
郭玉成:
一定要有SGMLParser.__init__(self) ...
用python解析html--SGMLParser -
jakejone:
支持一下,我刚开始学python,感觉不错,就是文档太少了。
python开发环境Eclipse+pydev字体和颜色设置方法(另附pydev安装方法)
sgmllib.py 包含一个重要的类: SGMLParser。SGMLParser 将 HTML 分解成有用的片段, 比如开始标记和结束标记。一旦它成功地分解出某个数据为一个有用的片段,它会根据 所发现的数据,调用一个自身内部的方法。为了使用这个分析器,您需要子类化 SGML- Parser类,并且覆盖这些方法。
SGMLParser类里面包含了很多内部方法,开始读取html后,遇到相应的数据就会调用其对应的方法,最重要的方法有三个:
start_tagname(self, attrs)
end_tagname(self)
handle_data(self, text)
tagname就是标签名称,比如当遇到<pre>,就会调用start_pre,遇到</pre>,就会调用 end_pre,attrs即为标签的参数,以[(attribute, value), (attribute, value), ...]的形式传回,我们要做的就是在其子类重载自己感兴趣标签对应的函数。
一个经典的例子:
顾名思义,这个类的作用就是把html中的所有连接(<a>标签)中的地址(href属性的值)提取出来,放到一个list里面,很实用的功能。^^
比如处理下面的html:
很乱对吧?下面让举个例子利用URLLister提取出上面mp3下载的地址:
date="上面那一堆…………"
lister=URLLister()
lister.feed(date)
用feed()把要处理的html传递给对象实体,然后我们来看看处理结果:
print lister.urls
显示:
['http://galeki.xy568.net/music/Delicate.mp3',
'http://galeki.xy568.net/music/Volcano.mp3',
"http://galeki.xy568.net/music/The Blower's Daughter.mp3",
'http://galeki.xy568.net/music/Cannonball.mp3',
'http://galeki.xy568.net/music/Older Chests.mp3',
'http://galeki.xy568.net/music/Amie.mp3',
"http://galeki.xy568.net/music/Cheers Darlin'.mp3",
'http://galeki.xy568.net/music/Cold Water.mp3',
'http://galeki.xy568.net/music/I Remember.mp3',
'http://galeki.xy568.net/music/Eskimo.mp3']
好了,是不是很方便?现在我们知道了如何处理标签中的属性,那么如何处理标签包含的文字呢?就是上面列出的handle_data(self, text),当遇到标签内的内容,就会调用这个函数,传入的text自然就是标签内的内容了,不过,如何筛选出感兴趣标签内的内容呢?比如上面歌曲的列 表,这时候就要配合start_tagname、end_tagname,用做标记的方法来达到这个目的:
这里添加了一个is_a标记,再在handle_date中添加一个if,也就是说,仅仅在a标签内,才会把标签里的内容加到name[]里去。
看看结果:
显示:
['1.Delicate', '2.Volcano', "3.The Blower's Daughter",
'4.Cannonball ', '5.Order Chests', '6.Amie',
'7.Cheers Darling', '8.Cold water', '9.I remember',
'10.Eskimo']
OK,搞定~
SGMLParser内置的方法不仅仅只有这三个,还有处理注释的handle_comment,还有处理声明的handle_decl等等等等,不过使用方法和上面的基本相同,不再多写了。
SGMLParser类里面包含了很多内部方法,开始读取html后,遇到相应的数据就会调用其对应的方法,最重要的方法有三个:
start_tagname(self, attrs)
end_tagname(self)
handle_data(self, text)
tagname就是标签名称,比如当遇到<pre>,就会调用start_pre,遇到</pre>,就会调用 end_pre,attrs即为标签的参数,以[(attribute, value), (attribute, value), ...]的形式传回,我们要做的就是在其子类重载自己感兴趣标签对应的函数。
一个经典的例子:
from sgmllib import SGMLParser class URLLister(SGMLParser): self.urls = [] def start_a(self, attrs): href = [v for k, v in attrs if k=='href'] if href: self.urls.extend(href)
顾名思义,这个类的作用就是把html中的所有连接(<a>标签)中的地址(href属性的值)提取出来,放到一个list里面,很实用的功能。^^
比如处理下面的html:
<tr> <td height="207" colspan="2" align="left" valign="top" class="normal"> <p>Damien Rice - 《0》 </p> <a href="http://galeki.xy568.net/music/Delicate.mp3">1. Delicate</a><br /> <a href="http://galeki.xy568.net/music/Volcano.mp3">2. Volcano</a><br /> <a href="http://galeki.xy568.net/music/The Blower's Daughter.mp3">3. The Blower's Daughter</a><br /> <a href="http://galeki.xy568.net/music/Cannonball.mp3">4. Cannonball </a><br /> <a href="http://galeki.xy568.net/music/Older Chests.mp3">5. Order Chests</a><br /> <a href="http://galeki.xy568.net/music/Amie.mp3">6. Amie</a><br /> <a href="http://galeki.xy568.net/music/Cheers Darlin'.mp3">7. Cheers Darling</a><br /> <a href="http://galeki.xy568.net/music/Cold Water.mp3">8. Cold water</a><br /> <a href="http://galeki.xy568.net/music/I Remember.mp3">9. I remember</a><br /> <a href="http://galeki.xy568.net/music/Eskimo.mp3">10. Eskimo</a></p> </td> </tr>
很乱对吧?下面让举个例子利用URLLister提取出上面mp3下载的地址:
date="上面那一堆…………"
lister=URLLister()
lister.feed(date)
用feed()把要处理的html传递给对象实体,然后我们来看看处理结果:
print lister.urls
显示:
['http://galeki.xy568.net/music/Delicate.mp3',
'http://galeki.xy568.net/music/Volcano.mp3',
"http://galeki.xy568.net/music/The Blower's Daughter.mp3",
'http://galeki.xy568.net/music/Cannonball.mp3',
'http://galeki.xy568.net/music/Older Chests.mp3',
'http://galeki.xy568.net/music/Amie.mp3',
"http://galeki.xy568.net/music/Cheers Darlin'.mp3",
'http://galeki.xy568.net/music/Cold Water.mp3',
'http://galeki.xy568.net/music/I Remember.mp3',
'http://galeki.xy568.net/music/Eskimo.mp3']
好了,是不是很方便?现在我们知道了如何处理标签中的属性,那么如何处理标签包含的文字呢?就是上面列出的handle_data(self, text),当遇到标签内的内容,就会调用这个函数,传入的text自然就是标签内的内容了,不过,如何筛选出感兴趣标签内的内容呢?比如上面歌曲的列 表,这时候就要配合start_tagname、end_tagname,用做标记的方法来达到这个目的:
class ListName(SGMLParser): is_a="" name=[] def start_a(self, attrs): self.is_a=1 def end_a(self): self.is_a="" def handle_data(self, text): if self.is_a: self.name.append(text)
这里添加了一个is_a标记,再在handle_date中添加一个if,也就是说,仅仅在a标签内,才会把标签里的内容加到name[]里去。
看看结果:
listname=ListName() listname.feed(date) print listname.name
显示:
['1.Delicate', '2.Volcano', "3.The Blower's Daughter",
'4.Cannonball ', '5.Order Chests', '6.Amie',
'7.Cheers Darling', '8.Cold water', '9.I remember',
'10.Eskimo']
OK,搞定~
SGMLParser内置的方法不仅仅只有这三个,还有处理注释的handle_comment,还有处理声明的handle_decl等等等等,不过使用方法和上面的基本相同,不再多写了。
发表评论
-
一句话反射shell
2014-12-28 16:13 2909通过一句话反射一个shell 首先你在自己的及其上起 ... -
微信公共平台框架-python(支持多账号)
2014-04-15 15:39 4113email:zealzpc@gmail.com 因 ... -
进程管理工具 supervisor
2013-03-14 12:01 1685经常在服务器上会启动很多程序,然后重启一下又要一个个重新启 ... -
tornado 问题小计
2013-01-29 12:47 13991 tornaod在ubuntu 的安装目录 /usr/ ... -
django1.4 问题记录
2013-01-28 13:59 9121 ImportError: Settings canno ... -
聊聊 tornado 的异步回调
2013-01-17 10:47 14038异步回调程序的原理和写法我不就不介绍了,因为我主要是来吐槽下 ... -
小谈django 的 cookie和session
2012-11-12 00:03 9975本文针对django1.4 周末小闲在家研究了下dja ... -
小记 django 1.4的变化
2012-11-06 23:23 1593最近因为公司游戏功能逐渐到了收尾阶段也算空下来点了,就索性想尝 ... -
使用redisco轻松将python内置数据类型存入redis内
2012-07-26 23:12 9656我在之前的 <python使 ... -
python使用redis 神器 ---redisco(一)
2012-07-07 22:42 28643很久没认真推荐过东西了,实在是人懒也没以前那么有心思去研究 ... -
redis set轻松做排行榜应用
2012-05-31 20:23 15533Author:pako email:zealzpc@gmai ... -
永久修改python默认的字符编码为utf-8
2011-08-19 14:06 17707这个修改说来简单,其实不同的系统,修改起来还真不一样。下面来罗 ... -
ubuntu 上安装pycurl
2011-07-12 11:20 3139我 是 在 8。04上 安装的装了 easy_installl ... -
使用Twisted Application 框架
2011-06-20 15:12 6857翻译by:pako email/gtalk:zealzpc@ ... -
用twisted创建tcp socket长链接amf server服务
2011-06-17 13:45 6843#Author:pako #Email/gta ... -
twisted:调用deferredlist多线程并发执行任务然后收集结果
2011-06-09 10:54 4516最近想通过twisted实现多线程并发去执行一件耗时的事,然后 ... -
对twisted 中deferred异步的理解
2011-03-29 15:38 4627最近小试了下twisted,还是发现用起来挺方便的,加之本身就 ... -
twisted简单实现多线程,轮询,后台daemon运行
2011-03-29 11:25 3268from twisted.application impo ... -
《django web开发指南》在v1.2.4版本上的出入
2011-01-25 00:44 1522<Django web 开发指南>第145页 第七 ... -
django.utils._os 中 safe_join 函数 windows下总报ValueError异常
2011-01-20 17:20 1805最近无聊在家看看django ...
相关推荐
`HTMLParser`不支持XPath或CSS,但它可以通过自定义事件处理函数来解析HTML并执行特定的操作。以下是一个基本示例: ```python from html.parser import HTMLParser class MyHTMLParser(HTMLParser): def handle_...
- 使用Expat XML解析器解析XML文档。 - 类如`xml.parsers.expat.ParserCreate()`。 - **sgmllib模块**(已废弃) - 提供解析SGML文档的基本框架。 - 类如`sgmllib.SGMLParser`。 - **htmllib模块**(已废弃) -...
在给定的文档中,我们看到如何使用 Python 来解析 HTML 并提取特定标签(如 `<h4>`)内的内容。 首先,Python 自带的 `SGMLParser` 是一个解析 SGML(Standard Generalized Markup Language)的库,它可以用来处理 ...
- 对于更复杂的爬虫项目,可以使用像`BeautifulSoup`或`lxml`这样的库解析HTML,它们提供了更友好的API来查找和处理HTML元素。 - 爬虫还需要考虑反爬策略,如设置代理、更换User-Agent、处理验证码等。 - 数据...
下面是一个简单的爬虫程序实例,展示了如何使用Python的`urllib`和`sgmllib`库来抓取和解析网页内容: ```python import urllib import sgmllib class HandleHTML(sgmllib.SGMLParser): def unknown_starttag(self...
SGMLParser 库是一个 Python 库,用于解析 HTML 文档。作者使用了 SGMLParser 库来解析下载的网页,提取其中的链接。 4.toolbox_insight.py 文件的作用 toolbox_insight.py 文件是一个工具文件,提供了一些基础的...
其次,Python 的 SGMLParser 库可以用来解析 HTML 文档,并提取其内容。SGMLParser 库是一个基于 SGML 的解析器,它可以用来解析 HTML、XML 等文档,并提取其内容。 下面是一个使用 Python 实现网络爬虫的示例代码...
对于更复杂的网络爬虫任务,比如处理JavaScript动态加载的内容,可能需要使用像Selenium这样的工具,或者像PyQuery、BeautifulSoup这样的库来解析HTML。 最后,提到了`pycurl`模块,这是一个Python绑定到libcurl的...
2. **网页内容提取**:在上述代码中,`SGMLParser`是Python标准库`sgmllib`的一部分,用于解析HTML或SGML文档。`Html2txt`类是自定义的解析器,通过重写`handle_data`方法来处理HTML中的文本内容。`start_head`和`...
- `SGMLParser` 类:Python 标准库中的 `sgmllib` 模块提供了 `SGMLParser` 类,用于解析 SGML(包括 HTML)文档。在示例的 `Html2txt` 类中,`handle_data` 方法用于处理 HTML 文档中的文本数据,`start_head` 和 ...
在提供的代码示例中,使用了SGMLParser类(在旧版Python中)来解析HTML内容并提取文本。`Html2txt`类继承自`SGMLParser`,并重写了`handle_data`方法来收集在`<body>`标签内的文本。当解析到`<head>`标签时,`inbody...
Htmllib(sgmllib)是最古老的模块之一,仅能简单解析HTML,但支持性较差。相比之下,BeautifulSoup提供了更好的容错性和标签搜索功能,适合处理不规范的HTML文档。Selenium是一个自动化Web测试工具,内置JavaScript...
2. **网页解析**:对于HTML内容的解析,示例代码使用了`sgmllib`模块的`SGMLParser`类。`Html2txt`类继承自`SGMLParser`,并在处理HTML数据时将文本内容保存到`text`变量中。`handle_data()`方法用于处理HTML标签间...
* 使用 sgmllib 解析 html 文本 * 自定义类继承 sgmllib 的 SGMLParser,复写 SGMLParser 的方法,添加自己自定义的标签处理函数 知识点七:爬虫技术的未来发展 爬虫技术的未来发展方向包括: * 单机爬虫到分布式...
这里用到了SGMLParser,一种用于解析HTML和XML的Python库,能够帮助开发者定位到form表单和input元素。 提到的urlopen是Python标准库中的一个方法,用于发起网络请求。文档中展示了如何使用urllib2构建一个带有...