首页 > 深入Python > HTML 处理 > 从 HTML 文档中提取数据 | << >> | ||||
diveintopython.org Python for experienced programmers |
为了从HTML文档中提取数据,将 SGMLParser 类进行子类化,然后对想要捕捉的标记或实体定义方法。
从HTML文档中提取数据的第一步是得到某个HTML文件。如果在你的硬盘里存放着HTML文件,你可以使用 file函数 将它读出来,但是真正有意思的是从实际的网页得到HTML。
>>> import urllib >>> sock = urllib.urlopen("http://diveintopython.org/") >>> htmlSource = sock.read() >>> sock.close() >>> print htmlSource <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head> <meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1'> <title>Dive Into Python</title> <link rel='stylesheet' href='diveintopython.css' type='text/css'> <link rev='made' href='mailto:f8dy@diveintopython.org'> <meta name='keywords' content='Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free'> <meta name='description' content='a free Python tutorial for experienced programmers'> </head> <body bgcolor='white' text='black' link='#0000FF' vlink='#840084' alink='#0000FF'> <table cellpadding='0' cellspacing='0' border='0' width='100%'> <tr><td class='header' width='1%' valign='top'>diveintopython.org</td> <td width='99%' align='right'><hr size='1' noshade></td></tr> <tr><td class='tagline' colspan='2'>Python for experienced programmers</td></tr> [...略...]
urllib 模块是标准Python库的一部分。它包含了一些函数,可以从基于互联网的URL(主要指网页)来获取信息并且真正取回数据。 |
|
urllib 模块最简单的使用是提取用 urlopen 函数取回的网页的整个文本。打开一个URL同 打开一个文件相似。urlopen 的返回值是象文件一样的对象,它具有一个文件对象一样的方法。 | |
使用由 urlopen 所返回的类文件对象所能做的最简单的事情就是 read,它可以将网页的整个HTML读到一个字符串中。这个对象也支持 readlines 方法,这个方法可以将文本按行放入一个列表中。 | |
当用完这个对象,要确保将它关闭,就象关闭一个普通的文件对象。 | |
现在我们让 http://diveintopython.org/ 主页的完整的HTML保存在一个字符串中了,接着我们将分析它。 |
如果你还没有运行过,可以下载本例或本书用到的其它的例子。
from sgmllib import SGMLParser class URLLister(SGMLParser): def reset(self): SGMLParser.reset(self) self.urls = [] def start_a(self, attrs): href = [v for k, v in attrs if k=='href'] if href: self.urls.extend(href)
>>> import urllib, urllister >>> usock = urllib.urlopen("http://diveintopython.org/") >>> parser = urllister.URLLister() >>> parser.feed(usock.read()) >>> usock.close() >>> parser.close() >>> for url in parser.urls: print url toc.html #download toc.html history.html download/dip_pdf.zip download/dip_pdf.tgz download/dip_pdf.hqx download/diveintopython.pdf download/diveintopython.zip download/diveintopython.tgz download/diveintopython.hqx [...略...]
调用定义在 SGMLParser 中的 feed 方法,将HTML内容放入分析器中。[7]这个方法接收一个字符串,这个字符串就是 usock.read() 所返回的。 | |
象处理文件一样,一旦处理完毕,你应该 close 你的URL对象。 |
|
你也应该 close 你的分析器对象,但出于不同的原因。feed 方法不保证对传给它的全部HTML进行处理,它可能会对其进行缓冲处理,等待接收更多的内容。一旦没有更多的内容,应调用 close 来刷新缓冲区,并且强制所有内容被完全处理。 | |
一旦分析器关闭,分析过程也就结束了。parser.urls 中包含了在HTML文档中所有的链接URL。 |
脚注
[7] 象 SGMLParser 这样的分析器,技术术语叫做消费者(consumer)。它消费HTML,并且拆分它。也许因为这就选择了 feed 这个名字,以便同“消费者”这个主题相适应。就个人来说,它让我想象在动物园看展览。里面有一个黑漆漆的兽穴,没有树,没有植物,没有任何生命的迹象。但只要你非常安静地站着,尽可能靠近着瞧,你会看到在远处的角落里有两只明眸在盯着你。但是你会安慰自已那不过是心理作用。唯一知道兽穴里并不是空无一物的方法,就是在栅栏上有一个不明显的标记,上面写着“禁止给分析器喂食”。但也许只有我这么想,不管怎么样,这种心理想象很有意思。
sgmllib.py 介绍 |
1 2 3 4 5 6 7 8 9 10 11 |
BaseHTMLProcessor.py 介绍 |