分类: Python/Ruby
2010-09-21 00:59:43
标签:
杂谈 |
|
利用Python抓取和解析网页(上)原文地址:
对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文将具体先容如何利用Python抓取和解析网页。首 先,我们先容一个可以帮助简化打开位于本地和Web上的HTML文档的Python模块网页抓取,然后,我们论述如何使用Python模块来迅速解析在 HTML文件中的数据,从而处理特定的内容,如链接、图像和Cookie等。最后,我们会给出一个规整HTML文件的格式标签的例子,通过这个例子您会发 现使用python处理HTML文件的内容是非常简单的一件事情。
一、解析URL
通过Python所带的urlparse模块,我们能够轻松地把URL分解成元件python html解析,之后,还能将这些元件重新组装成一个URL。当我们处理HTML 文档的时候,这项功能是非常方便的。
import urlparse parsedTuple = urlparse.urlparse( " hl=en&q=urlparse&btnG=Google+Search") unparsedURL = urlparse.urlunparse((URLscheme, \ URLlocation, URLpath, '', '', '')) newURL = urlparse.urljoin(unparsedURL, "/module-urllib2/request-objects.html")
函数urlparse(urlstring [, default_scheme [, allow_fragments]])的作用是将URL分解成不同的组成部分,它从urlstring中取得URL,并返回元组 (scheme, netloc, path, parameters, query, fragment)。留意python抓取,返回的这个元组非常有用,例如可以用来确定网络协议(HTTP、FTP等等 )、服务器地址、文件路径网页音乐抓取,等等。
函数urlunparse(tuple)的作用是将URL的组件装配成一个URLpython 网页,它接收元组(scheme, netloc, path, parameterspython 网页游戏, query, fragment)后,会重新组成一个具有正确格式的URL,以便供Python的其他HTML解析模块使用。
函数urljoin(base, url [, allow_fragments]) 的作用是拼接URL,它以第一个参数作为其基地址,然后与第二个参数中的相对地址相结合组成一个尽对URL地址。函数urljoin在通过为URL基地址 附加新的文件名的方式来处理同一位置处的若干文件的时候格外有用。需要留意的是,假如基地址并非以字符/结尾的话,那么URL基地址最右边部分就会被这个 相对路径所替换。比如,URL的基地址为,URL的相对地址为test.html,那么两者将合 并成,而非 /test.html。假如希看在该路径中保存末端目录,应确保URL基地址以字符/结尾。
下面是上面几个函数的具体一点的用法举例:
import urlparse URLscheme ="http" URLlocation = "" URLpath = "lib/module-urlparse.html" modList = ("urllib", "urllib2", \ "httplib", "cgilib") #将地址解析成组件 print "用Google搜索python时地址栏中URL的解析结果" parsedTuple = urlparse.urlparse( " hl=en&q=python&btnG=Google+Search") print parsedTuple #将组件反解析成URL print "\反解析python文档页面的URL" unparsedURL = urlparse.urlunparse( \ (URLscheme, URLlocation, URLpath, '', '', '')) print "\t" + unparsedURL #将路径和新文件组成一个新的URL print "\n利用拼接方式添加更多python文档页面的URL" for mod in modList: newURL = urlparse.urljoin(unparsedURL, \ "module-%s.html" % (mod)) print "\t" + newURL #通过为路径添加一个子路径来组成一个新的URL print "\n通过拼接子路径来天生Python文档页面的URL" newURL = urlparse.urljoin(unparsedURL, "module-urllib2/request-objects.html") print "\t" + newURL
上述代码的执行结果如下所示:
用Google搜索python时地址栏中URL的解析结果
('http', '', '/search'网页抓取工具, '', 'hl=en&q=python&btnG=Google+Search', '') 反解析python文档页面的URL http:///lib/module-urlparse.html 利用拼接方式添加更多python文档页面的URL http:///lib/module-urllib.html http:///lib/module-urllib2.html http:///lib/module-httplib.html http:///lib/module-cgilib.html 通过拼接子路径来天生Python文档页面的URL http:///lib/module-urllib2/request-objects.html
二、打开HTML文档 上面先容了如何解析页面的URL,现在开始讲解如何通过URL打开一个网页。实际上,Python所带的urllib和urllib2这两个模块为我们提供了从URL打开并获取数据的功能,当然,这包括HTML文档。
import urllib u = urllib.urlopen(webURL) u = urllib.urlopen(localURL) buffer = u.read() print u.info() print "从%s读取了%d 字节数据.\n" % (u. geturl_r(),len(buffer) )
若要通过urllib模块中的urlopen(url [,data])函数打开一个HTML文档python xml 解析,必须提供该文档的URL地址,包括文件名。函数urlopen不仅可以打开位于远程web服务器上的文件,而且可以打开一个本地文件python 抓取网页,并返回一个类似文件的对象网页flash抓取器,我们可以通过该对象从HTML文档中读出数据。
一旦打开了HTML文档,我们就可以像使用常规文件一样使用read([nbytes])、readline()和readlines()函数来对文件进行读操纵。若要读取整个HTML文档的内容的话,您可以使用read()函数,该函数将文件内容作为字符串返回。
打开一个地址之后,您可以使用 geturl_r()函数取得被获取网页的真正的URL。这是很有用的,由于urlopen(或使用的opener对象)也许会伴随一个重定向。获取的网页URL也许和要求的网页URL不一样。
另一个常用的函数是位于从urlopen返回的类文件对象中的info()函数,这个函数可以返回URL位置有关的元数据,比如内容长度、内容类型,等等。下面通过一个较为具体的例子来对这些函数进行说明。
import urllib webURL = "http://" localURL = "index.html" #通过URL打开远程页面 u = urllib.urlopen(webURL) buffer = u.read() print u.info() print "从%s读取了%d 字节数据.\n" % (u. geturl_r(),len(buffer) ) #通过URL打开本地页面 u = urllib.urlopen(localURL) buffer = u.read() print u.info() print "从%s读取了%d 字节数据.\n" % (u. geturl_r(),len(buffer) )
上面代码的运行结果如下所示:
Date: Fri, 26 Jun 2009 10:22:11 GMT Server: Apache/2.2.9 (Debian) DAV/2 SVN/1.5.1 mod_ssl/2.2.9 OpenSSL/0.9.8g mod_wsgi/2.3 Python/2.5.2 Last-Modified: Thu, 25 Jun 2009 09:44:54 GMT ETag: "105800d-46e7-46d29136f7180" Accept-Ranges: bytes Content-Length: 18151 Connection: close Content-Type: text/html 从http://读取了18151 字节数据. Content-Type: text/html Content-Length: 865 Last-modified: Fri, 26 Jun 2009 10:16:10 GMT 从index.html读取了865 字节数据.
三、小结
对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文中,我们先容了一个可以帮助简化打开位于本地和Web 上的HTML文档的Python模块。在下篇中,我们将论述如何使用Python模块来迅速解析在HTML文件中的数据,从而处理特定的内容,如链接、图 像和Cookie等。