科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件如何使用Python进行Web数据处理

如何使用Python进行Web数据处理

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

作者:builder.com.cn 2007年1月17日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

管理用户输入

在任何时候,程序都是依赖于用户的输入工作。如果用户的输入有误,就会导致程序出错。大多数时候,如果程序出错的时候能够给出错误提示并且关闭程序,那么程序已经做得不错了。当然,程序可以进一步的完善,例如更正用户的输入,使得程序能继续运行。在下面的程序中,用户需要提供一个网址作为函数参数,所以我们将检查用户输入是否是一个合法的网址——这一程序是为Web站点开发,所以我们只接受使用HTTP协议的地址。我们将会编写函数来检查这一点,如果没有给出协议名称,就自动添加HTTP协议标准。完整的函数代码如下。接下来我们将详细分析这段代码,所以现在不理解也不要担心:

def parseAddress(input):

if input[:7] != "http://":

if input.find("://") != -1:

print "Error: Cannot retrieve URL, protocol must be HTTP"

sys.exit(1)

else:

input = "http://" + input

return input

首先,我们定义一个parseAddress函数,该函数需要一个参数,我们称之为input。下一步我们需要判断是否得到一个正确的地址,我们检查字符串的起始字符(要记得input[:7]返回输入字符串的一部分,从开始字符直到第七个字符)是否为“http://”。如果是,就没有问题。反之,程序就会出错。但是,如果只是没有指定网络协议,我们可以假定用户提供的是没有指定网络协议的http地址。我们可以使用字符串函数find来检查是否指定了协议。find函数可以对字符串和子字符串进行操作,返回值是最先匹配的字符串所在位置或者-1。-1代表没有找到匹配的字符串,例如:

>>> "hello world".find("hello")

0

>>> "hello world".find("wor")

6

>>> "hello world".find("word")

-1

让我们来测试这一函数(注意:如果你在解释器里执行这个函数,则需要导入sys文件,因为parseAddress函数中还调用了exit函数):

>>> parseAddress("http://www.builderau.com.au")

'http://www.builderau.com.au'

>>> parseAddress("www.builderau.com.au")

'http://www.builderau.com.au'

>>> parseAddress("ftp://builderau.com.au")

Error: Cannot retrieve URL, protocol must be HTTP

打开浏览HTTP站点

Python的标准库中含有许多模块,从而使得复杂的任务变得很简单。在下面的例子中,我们将要使用urllib2模块来完成打开web页面。使用urllib2模块打开和浏览web站点就如同打开文本文件一样简单:

import urllib2

website = urllib2.urlopen(address)

website_html = website.read()

和文件操作一样,你在访问网络站点的时候也会出错。可能是服务器关机了,也可能是你的Internet连接中断了,还有可能是你查询的文件不存在。不管是什么原因造成,你需要解决这些问题。在Python中正确处理这些问题的方法是使用异常。Urlopen函数能够抛出很多不同的例外,需要掌握的两个异常,一个是HTTPError,当抛出这个异常的时候,你所连接的服务器也同时返回一个错误代码。另一个要掌握异常是URLError,这个异常在其它网络或者协议发生错误时抛出。你可以通过下面的方法捕获异常:

try:

website = urllib2.urlopen(address)

except urllib2.HTTPError, e:

print "Cannot retrieve URL: HTTP Error Code", e.code

except urllib2.URLError, e:

print "Cannot retrieve URL: " + e.reason[1]

因此,当你尝试解析一个不存在的URL的时候,你将会看到类似下面的错误信息:

% python2.4 images.py www.google.com/doesnotexist

Cannot retrieve URL: HTTP Error Code 404

通过错误代码404,我们可能会获取更多的信息,因为我们已经遇到过很多次。但是你能够解释下面这些代码所代表的含义吗?例如,错误代码407表示需要指定代理服务器,错误代码503表示服务器正在超负荷运行,不能处理当前的请求。很明显,我们需要一种更友好的方式给用户反馈错误信息。同样,Python中也提供了这个功能。这是通过BaseHTTPServer模块中定义的字典来完成。字典是Python中的基本数据类型,在其它语言中也被称之为hash表或者map,我们以后将会详细介绍字典。现在我们就简单地将它认为是一个列表,只是它不仅能按照索引顺序返回条目,也可以按照指定的任意其它标示符按序返回。其中,字典BaseHTTPRequestHandler.responses提供了一个错误编码和解释之间的映射表——-如果你对这个映射表感兴趣,可以参照HTTP 1.1 规范 RFC,所以下面的代码:

import BaseHTTPServer

print BaseHTTPServer.BaseHTTPRequestHandler.responses[404]

产生如下的输出:

('Not Found', 'Nothing matches the given URI')

我们可以使用字典输出更详细的错误信息。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章