Python’da HTML Tag Kontrol Programı
Merhabalar, okul zamanında verilen bir ödev üzerine Stack(Yığıt) veri yapısıyla HTML Tag Checker( HTML Tag Kontrol) yani açılan HTML Tag’lerinin düzgün kapatılıp kapatılmadığını kontrol eden bir program yazmıştık Python’da.
Bu programın kodlarını sizlerle paylaşmak ve elimden geldiğince açıklamak istedim. Kodların tamamına bakacak olursak ;
class Stack: def __init__(self): self.alist=[] def pop(self): return self.alist.pop() def push(self,a): self.alist.append(a) def show(self): return self.alist def peek(self): return self.alist[len(alist)-1] def isEmpty(self): return len(self.alist)==0 def html_tag_checker(sayfa): tags=html_filtrele(sayfa) return tag_checker(tags) def html_filtrele(sayfa): deneme=open(sayfa,"r") yazi="" yazi=deneme.read() yenidizi=[] i=0 while i<len(yazi): yeni="" if yazi[i]=="<": while yazi[i]!=">": yeni=yeni+yazi[i] i=i+1 yeni=yeni+yazi[i] i=i+1 yenidizi.append(yeni) else: i=i+1 return yenidizi def tag_checker(s): yigit=Stack() i=0 opens=['<html>','<head>','<title>','<h1>','<b>','<body>','<h2>','<u>','<i>'] closers=['</html>','</head>','</title>','</h1>','</b>','</body>','</h2>','</u>','</i>'] balanced=True while i<len(s) and balanced: tag=s[i] if tag in opens: yigit.push(tag) else: if yigit.isEmpty(): balanced=False else: cek=yigit.pop() if opens.index(cek)!=closers.index(tag): balanced=False i=i+1 if yigit.isEmpty() and balanced: return True else: return False
Öncelikle Stack sınıfı standart olarak push pop peek fonksiyonlarının tanımlandığı Yığıt veri yapısını oluşturuyor. html_filtrele() fonksiyonu da belirtmiş olduğumuz .html dosyasındaki < ile başlayıp > ile biten tagleri yenidizi isimli diziye atıyor. tag_checker() fonksiyonu ise Stack class’ının fonksiyonları yardımıyla balanced(eşleşme) var mı yok mu onu kontrol ediyor. burada FIFO yani son giren son çıkar mantığı yığıt veri yapılarının temelini oluşturuyor. if tag in opens: kontrol yapısıyla açılan tagleri yığıta atıyoruz. yığıt boşsa balanced değeri False olup döngüden direk çıkılıyor ancak yığıt doluysa ve tag opens’da değilse(yani kapalı tag ise </html> gibi, pop edilip çekiliyor. cekilen değerin index’iyle closers dizisindeki index uymazsa balanced tekrar false olarak while döngüsünün dışına çıkılıyor. ve bir sonraki elemana geçiliyor.
Örnek vermek gerekirse
<html><head> <title>Sayfa Başlığı</title> </head><body> İçerik</body></html>
Böyle bir html dosyası eşleşmeyi true gösterirken.
<html><head> <title>Sayfa Başlığı</head></title> <body> İçerik</body></html>
Böyle bir html dosyası <title> dan sonra </head> olduğu için eşleşmeyi false gösterir. Tagler sizin kontrolünüze göre artırıp azaltılabilir veya daha spesifik hale getirmek istersek tagler otomatiğe bağlanabilir. HTML Tag kontrol programı python 3.x de derlenmiştir. deneyebilirsiniz.
Kolay gelsin.