`

用python解析html--SGMLParser

阅读更多
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), ...]的形式传回,我们要做的就是在其子类重载自己感兴趣标签对应的函数。

一个经典的例子:
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等等等等,不过使用方法和上面的基本相同,不再多写了。 
分享到:
评论
2 楼 郭玉成 2013-02-19  
一定要有SGMLParser.__init__(self)  否则初学者会迷糊的!
1 楼 obamaxys2011 2012-09-27  
学习了,非常感谢

相关推荐

    python解析html的几种方法

    `HTMLParser`不支持XPath或CSS,但它可以通过自定义事件处理函数来解析HTML并执行特定的操作。以下是一个基本示例: ```python from html.parser import HTMLParser class MyHTMLParser(HTMLParser): def handle_...

    python standerd labrary中文版

    - 使用Expat XML解析器解析XML文档。 - 类如`xml.parsers.expat.ParserCreate()`。 - **sgmllib模块**(已废弃) - 提供解析SGML文档的基本框架。 - 类如`sgmllib.SGMLParser`。 - **htmllib模块**(已废弃) -...

    python提取html当中的信息.docx

    在给定的文档中,我们看到如何使用 Python 来解析 HTML 并提取特定标签(如 `&lt;h4&gt;`)内的内容。 首先,Python 自带的 `SGMLParser` 是一个解析 SGML(Standard Generalized Markup Language)的库,它可以用来处理 ...

    用Python实现网络爬虫、蜘蛛.doc

    - 对于更复杂的爬虫项目,可以使用像`BeautifulSoup`或`lxml`这样的库解析HTML,它们提供了更友好的API来查找和处理HTML元素。 - 爬虫还需要考虑反爬策略,如设置代理、更换User-Agent、处理验证码等。 - 数据...

    python爬虫.docx

    下面是一个简单的爬虫程序实例,展示了如何使用Python的`urllib`和`sgmllib`库来抓取和解析网页内容: ```python import urllib import sgmllib class HandleHTML(sgmllib.SGMLParser): def unknown_starttag(self...

    用python编写网络爬虫.docx

    SGMLParser 库是一个 Python 库,用于解析 HTML 文档。作者使用了 SGMLParser 库来解析下载的网页,提取其中的链接。 4.toolbox_insight.py 文件的作用 toolbox_insight.py 文件是一个工具文件,提供了一些基础的...

    Python实现网络爬虫、蜘蛛.pdf

    其次,Python 的 SGMLParser 库可以用来解析 HTML 文档,并提取其内容。SGMLParser 库是一个基于 SGML 的解析器,它可以用来解析 HTML、XML 等文档,并提取其内容。 下面是一个使用 Python 实现网络爬虫的示例代码...

    python做网络爬虫

    对于更复杂的网络爬虫任务,比如处理JavaScript动态加载的内容,可能需要使用像Selenium这样的工具,或者像PyQuery、BeautifulSoup这样的库来解析HTML。 最后,提到了`pycurl`模块,这是一个Python绑定到libcurl的...

    Python抓取页面、Pthon爬虫参考资料

    2. **网页内容提取**:在上述代码中,`SGMLParser`是Python标准库`sgmllib`的一部分,用于解析HTML或SGML文档。`Html2txt`类是自定义的解析器,通过重写`handle_data`方法来处理HTML中的文本内容。`start_head`和`...

    Python实现网络爬虫、蜘蛛.docx

    - `SGMLParser` 类:Python 标准库中的 `sgmllib` 模块提供了 `SGMLParser` 类,用于解析 SGML(包括 HTML)文档。在示例的 `Html2txt` 类中,`handle_data` 方法用于处理 HTML 文档中的文本数据,`start_head` 和 ...

    python爬虫

    在提供的代码示例中,使用了SGMLParser类(在旧版Python中)来解析HTML内容并提取文本。`Html2txt`类继承自`SGMLParser`,并重写了`handle_data`方法来收集在`&lt;body&gt;`标签内的文本。当解析到`&lt;head&gt;`标签时,`inbody...

    python爬虫.doc

    Htmllib(sgmllib)是最古老的模块之一,仅能简单解析HTML,但支持性较差。相比之下,BeautifulSoup提供了更好的容错性和标签搜索功能,适合处理不规范的HTML文档。Selenium是一个自动化Web测试工具,内置JavaScript...

    python网络爬虫代码资料

    2. **网页解析**:对于HTML内容的解析,示例代码使用了`sgmllib`模块的`SGMLParser`类。`Html2txt`类继承自`SGMLParser`,并在处理HTML数据时将文本内容保存到`text`变量中。`handle_data()`方法用于处理HTML标签间...

    python爬虫零基础入门.docx

    * 使用 sgmllib 解析 html 文本 * 自定义类继承 sgmllib 的 SGMLParser,复写 SGMLParser 的方法,添加自己自定义的标签处理函数 知识点七:爬虫技术的未来发展 爬虫技术的未来发展方向包括: * 单机爬虫到分布式...

    利用Python的Twisted框架实现webshell密码扫描器的教程

    这里用到了SGMLParser,一种用于解析HTML和XML的Python库,能够帮助开发者定位到form表单和input元素。 提到的urlopen是Python标准库中的一个方法,用于发起网络请求。文档中展示了如何使用urllib2构建一个带有...

Global site tag (gtag.js) - Google Analytics