51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3638|回复: 1
打印 上一主题 下一主题

使用python测试网页中超链接的连通性

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-8-31 00:02:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在web测试,对网页中的超链接进行测试是最基本的工作,最简便的方法当然是使用像xenu之类的工具。但它具体是怎么实现的呢?我想也无外乎是通过http协议,根据超链接地址,向服务端发送请求,然后根据返回的信息进行判断连接的状态。下面是根据这种思路,用python编写的检测网页链接连通性的程序。2?,z7^ z"C&q+C6{051Testing软件测试网 k�C-G*V"a A#n:n D.R$V
首先,建立一个示例网页,其中link1,lin3是不连通的,link2,link4是有效链接

s.f'G*D*S"v�y0
/N0B C y f:C | p)\(D N b0<head>Test</head>51Testing软件测试网:y Z�Z N K s
<body>51Testing软件测试网 C1Y F W n \!Y P G
<a href="http://ggdfgdfg.com/erwerwe.html">link1</a>51Testing软件测试网%} z4e)~�D O�X V O
<a href="/sample/lik.html">link2</a>51Testing软件测试网*j k$a'w9p:t F+G
<a href="/sample/lik2.html">link3</a>51Testing软件测试网 ~7w;O x$x I Y s5n9k m1|
<a href="http://google.com">link4</a>51Testing软件测试网:O:C ]7} Z1B R
</body>

P [2Y&A a0
p'K W D m2G0使 用python进行链接检测,要使用到4个重要模块,过程就是通过urllib抓取目标网页的html代码,然后通过sgmllib模块解析html,获 取超链接的列表。然后使用urlparse解析超链接的url,供httplib使用。然后由httplib模块进行最后的请求及验证回复的过程。51Testing软件测试网&|'N W m;y M

51Testing软件测试网 Q7v5O h ` e3U y
sgmllib :用于HTML解析,解析出网页中包含的超链接51Testing软件测试网 ^ m*p/y"Q&o1U I#P

51Testing软件测试网2W f q'A R
httplib:用于Http协议的操作51Testing软件测试网#J-d V Y$| G

Y d([ g7| s D7X)Z0urllib:用于获取网页的html代码51Testing软件测试网 L&N'x T J3{,L

V j B y m0urlparse:解析url地址,把url地址解析成几个部分。

0Y&j e V l i2O ~ G3X051Testing软件测试网$S4p2h }-~�^ p T+V
具体实现代码如下:

D6K+[ Z u&|0K(E v F0
/l(\ ^&F T5G5_$|0#-×-coding:gb2312-*-51Testing软件测试网 A {5[ W O7H ] R M
import httplib,urllib,urlparse51Testing软件测试网 t'v c J P L x&[�n Y
from sgmllib import SGMLParser
K W ~ c C ^ x,M0#解析指定的网页的html,得到该页面的超链接列表51Testing软件测试网6G _ ] y I y
class URLLister(SGMLParser):
/v5l A-@;T/~ y { ?0    def reset(self):
(Q g g�l2A&o0        SGMLParser.reset(self)
"@ K L ?�n0        self.urls = []51Testing软件测试网 | [ g6w J S

-^ Q e:E"\0    def start_a(self, attrs):51Testing软件测试网$S#c0Z t:H0D
href = [v for k, v in attrs if k=='href']51Testing软件测试网+d�r T F4t._
if href:
x*a#o v9Z!n g U _0            self.urls.extend(href)51Testing软件测试网:v/k j Z _ L3o S
#遍历超链接列表,并逐个的发送请求,判断接收后的代码,200为正常,其他为不正常51Testing软件测试网 o*A N ?:Z!L T
def fetch(host):51Testing软件测试网 L;W8U v:e8^
usock = urllib.urlopen(host)51Testing软件测试网 B#c Y `/X h(G
parser = URLLister()51Testing软件测试网$f w2c ~-c�a+p
parser.feed(usock.read())
? c X'o&Y I T&F0        uhost = urlparse.urlparse(host)
D B G6N ` o+L0        for url in parser.urls:
8~4t3^*s%~)t0            up = urlparse.urlparse(url)51Testing软件测试网 { X R X%] R z S F
#因为超链接有两种方式:一种是直接的http://...... 一种是相对路径,/.../sample.html
n0p I b f0          #所以要分别处理51Testing软件测试网 R _:w1q g
if up.netloc =="":51Testing软件测试网.E&w _ v Y A s
http = httplib.HTTP(uhost.netloc)
2o T V+y5l&z8g s0                http.putrequest("GET", "/"+up.path+"?"+up.params+up.query+up.fragment)51Testing软件测试网,R S1^ O I J e.L D @
http.putheader("Accept", "*/*")51Testing软件测试网 z a l _ @ J2i1^ p7f
http.endheaders()51Testing软件测试网 U*G Z d6G s(}7\
else:
0a*x3b#S3_0                http = httplib.HTTP(up.netloc)51Testing软件测试网 Y"]6{*n(p f r ^
http.putrequest("GET", up.path+"?"+up.params+up.query+up.fragment)
B Y |$` { H7X x-K l:C0                http.putheader("Accept", "*/*")51Testing软件测试网:`"i q X;U
http.endheaders()
/Q4v$M3C S/}7w%q;U0            errcode, errmsg, headers = http.getreply()51Testing软件测试网'|*S#F f T
if errcode == 200:51Testing软件测试网 e x,| E"E T U [$Q
print url," : ok"51Testing软件测试网 J g�T1n;~ H ? r
else:
f L { k X n R+B0                print url," : ",errcode

1{ v G&Q2` C0
$p%] h6u z7b0{�n Q u�O v }0#测试51Testing软件测试网 S(^ n c#N#Q,B {
fetch("http://localhost/Sample/sample.html")51Testing软件测试网&a+F n6?8I r

51Testing软件测试网)O"@.J |7S.K
代码运行的结果:

Y!c!b B)W;} Y0 i K)] \5t6o0http://ggdfgdfg.com/erwerwe.html  :  40451Testing软件测试网,j c2Z�Q1Z
/sample/lik.html  : ok51Testing软件测试网6V9{ ?"E.T.a A x
/sample/lik2.html  :  40451Testing软件测试网 A8[ b*t c
http://google.com  : ok
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2011-5-20 16:26:19 | 只看该作者
支持下
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-16 21:34 , Processed in 0.074573 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表