一、解析URL
通过Python所带的urlparse模块,我们能够轻松地把URL分解成元件,之后,还能将这些元件重新组装成一个URL。当我们处理HTML 文档的时候,这项功能是非常方便的。
- import
urlparse -
- parsedTuple
= urlparse.urlparse( -
- "http://www.google.com/search?
-
- hl=en&q=urlparse&btnG=Google+Search")
-
- unparsedURL
= urlparse.urlunparse((URLscheme, -
- URLlocation,
URLpath, '', '', '')) -
- newURL
= urlparse.urljoin(unparsedURL, -
- "/module-urllib2/request-objects.html")
函数urlunparse(tuple)的作用是将URL的组件装配成一个URL,它接收元组(scheme, netloc, path, parameters, query, fragment)后,会重新组成一个具有正确格式的URL,以便供Python的其他HTML解析模块使用。
函数urljoin(base, url [, allow_fragments]) 的作用是拼接URL,它以第一个参数作为其基地址,然后与第二个参数中的相对地址相结合组成一个绝对URL地址。函数urljoin在通过为URL基地址 附加新的文件名的方式来处理同一位置处的若干文件的时候格外有用。需要注意的是,如果基地址并非以字符/结尾的话,那么URL基地址最右边部分就会被这个 相对路径所替换。比如,URL的基地址为Http://www.testpage.com/pub,URL的相对地址为test.html,那么两者将合 并成http://www.testpage.com/test.html,而非http://www.testpage.com/pub /test.html。如果希望在该路径中保留末端目录,应确保URL基地址以字符/结尾。
下面是上面几个函数的详细一点的用法举例:
- import
urlparse -
- URLscheme
= "http" -
- URLlocation
= "www.python.org" -
- URLpath
= "lib/module-urlparse.html" -
- modList
= ("urllib", "urllib2", -
- "httplib",
"cgilib") -
- #将地址解析成组件
-
- print
"用Google搜索python时地址栏中URL的解析结果" -
- parsedTuple
= urlparse.urlparse( -
- "http://www.google.com/search?
-
- hl=en&q=python&btnG=Google+Search")
-
- print
parsedTuple -
- #将组件反解析成URL
-
- print
"反解析python文档页面的URL" -
- unparsedURL
= urlparse.urlunparse( -
- (URLscheme,
URLlocation, URLpath, '', '', '')) -
- print
"t" + unparsedURL -
- #将路径和新文件组成一个新的URL
-
- print
" 利用拼接方式添加更多python文档页面的URL" -
- for
mod in modList: -
- newURL
= urlparse.urljoin(unparsedURL, -
- "module-%s.html"
% (mod)) -
- print
"t" + newURL -
- #通过为路径添加一个子路径来组成一个新的URL
-
- print
" 通过拼接子路径来生成Python文档页面的URL" -
- newURL
= urlparse.urljoin(unparsedURL, -
- "module-urllib2/request-objects.html")
-
- print
"t" + newURL
用Google搜索python时地址栏中URL的解析结果
- ('http',
'www.google.com', '/search', '', -
- 'hl=en&q=python&btnG=Google+Search',
'') -
- 反解析python文档页面的URL
-
- http://www.python.org/lib/module-urlparse.html
-
- 利用拼接方式添加更多python文档页面的URL
-
- http://www.python.org/lib/module-urllib.html
-
- http://www.python.org/lib/module-urllib2.html
-
- http://www.python.org/lib/module-httplib.html
-
- http://www.python.org/lib/module-cgilib.html
-
- 通过拼接子路径来生成Python文档页面的URL
-
- http://www.python.org/lib/module-urllib2/request-objects.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 字节数据. " % (u.geturl(),len(buffer) )
一旦打开了HTML文档,我们就可以像使用常规文件一样使用read([nbytes])、readline()和readlines()函数来对文件进行读操作。若要读取整个HTML文档的内容的话,您可以使用read()函数,该函数将文件内容作为字符串返回。
打开一个地址之后,您可以使用geturl()函数取得被获取网页的真正的URL。这是很有用的,因为urlopen(或使用的opener对象)也许会伴随一个重定向。获取的网页URL也许和要求的网页URL不一样。
另一个常用的函数是位于从urlopen返回的类文件对象中的info()函数,这个函数可以返回URL位置有关的元数据,比如内容长度、内容类型,等等。下面通过一个较为详细的例子来对这些函数进行说明。
- import
urllib -
- webURL
= "http://www.python.org" -
- localURL
= "index.html" -
- #通过URL打开远程页面
-
- u
= urllib.urlopen(webURL) -
- buffer
= u.read() -
- print
u.info() -
- print
"从%s读取了%d 字节数据. " % (u.geturl(),len(buffer) ) -
- #通过URL打开本地页面
-
- u
= urllib.urlopen(localURL) -
- buffer
= u.read() -
- print
u.info() -
- print
"从%s读取了%d 字节数据. " % (u.geturl(),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://www.python.org读取了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等。