python:判断一个字符串是否是URL

Python015

python:判断一个字符串是否是URL,第1张

urlopen返回的应答对象response有两个很有用的方法info()和geturl()

geturl -- 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象

使用的)或许会有重定向。获取的URL或许跟请求URL不同!

很多时候我们的程序会接收来自外部的数据,但是我们不能确保接收的数据是我们期待的数据,这时可能需要对数据进行一些验证。比如,在做接口测试时,我们发送http请求,会受到服务器的应答信息,这时需要对接收的数据进行检查,判断是否符合预期。

这里介绍一个简单的数据验证库 validators ,后续还会介绍其他的数据验证库。

python有很多数据验证工具,但是其他的数据验证工具都需要自己定义模式。validators是一个简单的数据验证库,当验证一个简单的值时,不需要定义一个表单或模式。

目前 validators 支持python版本2.7, 3.3, 3.4, 3.5 和PyPy

在validators中每一个validator是一个简单的函数,函数参数为要验证的值,一些函数可能有额外的关键字参数。对于每一个函数,如果验证成功,则返回 True ;若验证失败,则返回一个 ValidationFailure 对象。

验证一个数字 value 是否在最小值 min 和最大值 max 之间, value 不仅仅可以是整数,也可以是其它数据类型,例如floats, decimals 和 dates.

Parameters:

• min – The minimum required value of the number. If not provided, minimum value will not be checked.

• max – The maximum value of the number. If not provided, maximum value will not be checked.

验证 value 是否是一个有效域。如果 value 是一个有效域名,函数返回 True , 否则返回 ValidationFailure .

也支持国际化域名(IDN domain),例如:

验证是否是合法的邮件地址,如果是,函数返回 True , 否则返回 ValidationFailure .

验证是否是合法的国际银行账户号码,如果是,函数返回 True , 否则返回 ValidationFailure .

验证是否是合法的ipv4地址,如果是,函数返回 True , 否则返回 ValidationFailure .

验证是否是合法的ipv6地址,如果是,函数返回 True , 否则返回 ValidationFailure .

验证给定的字符串长度是否在指定范围内。

验证是否是合法的mac地址,如果是,函数返回 True , 否则返回 ValidationFailure .

验证是否是合法的slug,如果是,函数返回 True , 否则返回 ValidationFailure .

验证是否是合法的url,如果是,函数返回 True , 否则返回 ValidationFailure .

Parameters:

• value – 要验证的url

• public – (default=False) Set True to only allow a public IP address

验证Finnish Business ID.

验证Finnish Social Security Number.

class validators.utils.ValidationFailure(func, args)

validators.utils.validator(func, *args, **kwargs)

例:

控制台输出结果:

下一篇:Python数据验证库(二)validator

http://www.jianshu.com/p/eee56214af9c

因为工作需要,之前用python写了一些批量校验url有效性的小脚本,但并不全面,健壮性较差,现把之整理一下,代码如下:

#!/usr/bin/python

# -*- coding:utf-8 -*-

import urllib2

from urllib2 import URLError

result_url=[]

count=0

not_200=0

f=open("img1.txt","r")

img_not_200=open("img_not_200.txt","w+")

for line in f:

count+=1

print "on scanning ",count

try:

response=urllib2.urlopen(line)

except URLError, e:

if hasattr(e,'reason'): #stands for URLError

print "can not reach a server,writing..."

result_url.append(line)

not_200+=1

img_not_200.write(line)

print "write url success!"

elif hasattr(e,'code'): #stand

对这段代码解析如下:

如果url有效,则可以正常通过urlopen取到response,并且response.getcode()等于200;

但若url无效,无论是无法找到服务器还是其他http错误,都无法通过urlopen返回response。这个时候,就需要通过返回的错误类型来判断错误到底是url错误还是http错误。上面的程序是通过错误类型所拥有的属性来判断的。如果错误类型有“code”属性,则代表错误是HTTPError;如果属性有“reason”,则代表是URLError错误。

当然,也可以在except中分别指定抛出的错误类型,进而进行不同的处理。所要注意的是,因为HTTPError是URLError的子类,所以必须在第一个except中指定捕获HTTPError,第二个except中指定捕获URLError,否则的话,你懂的。。

收藏