Python’da HTML Tag Kontrol Programı

Kodlama admin 442 Okundu

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.

Sosyal Ağlarda Paylaş

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir