#!usr/bin/env python2-5
import os.path, re, HTMLParser, urllib, sys
# show the invalid (http validation concerned) files of a dir
def showInvalid(dir):
htmlFiles = lsHTMLDir(dir)
for i in htmlFiles:
pathName = dir + '/' + i
isValidHRef(pathName)
posSubdirs = os.listdir(dir)
for j in posSubdirs:
currentPath = dir + '/' + j
if os.path.isdir(currentPath):
showInvalid(currentPath)
# Return list with html files' names of a directory
def lsHTMLDir(dir):
if not os.path.isdir(dir):
print n," is not a valid directory."
return filter(isHTML,os.listdir(dir))
# Whether it is an HTML file or not
def isHTML(filename):
if re.match(".+\.html",filename) == None:
return False
else:
return re.match(".+\.html",filename).end() == len(filename)
# examine the hrefs of the html file and print their situation
def isValidHRef(file):
while not len(hyperlinks) == 0:
hyperlinks.pop()
a = contents(file)
b = MyHTMLParser()
b.feed(a)
for i in hyperlinks:
if not isValidHTTP(i):
print file,": ",i,"is not a valid URL"
elif not urlWorks(i):
print file,": ",i,"does not seem to be working"
else:
print file,": ",i,"looks good"
# return file's contents
def contents(filename):
f=open(filename,'r')
return f.read()
# whether it is a valid URL or not
def isValidHTTP(url):
if re.match("https?://[a-zA-Z0-9\-\+]+(\.[a-zA-Z0-9\-\+]+)+(/[a-zA-Z0-9\-\+\?\.\&]*)*",url) == None:
return False
else:
return re.match("https?://[a-zA-Z0-9\-\+]+(\.[a-zA-Z0-9\-\+]+)+(/[a-zA-Z0-9\-\+\?\.\&]*)*",url).end() == len (url)
# whether or not url works
def urlWorks(url):
try:
urllib.urlopen(url)
state = True
except IOError:
state = False
return state
hyperlinks = []
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
#print "Encountered the beginning of a %s tag" % tag
if tag == 'a':
hyperlinks.append(attrs.pop(0)[1])
def main():
showInvalid(sys.argv[1])