2015-10-23 16 views
0

雖然這是一個類的項目分配,但我正試圖瞭解如何執行項目的特定部分。如何在htmlChecker中清除異常

我需要通過一個html文件,並檢查是否所有的開放語句都與閉幕語句匹配。此外,它們必須按照正確的順序排列,並且必須使用我已經實現的堆棧進行檢查。截至目前,我正在從文件中提取每個標籤。艱難的部分似乎是我在這裏工作的兩個例外。
和。我需要刪除這些標籤,以便程序不會將它們作爲開頭或結尾語句讀取。

class Stack(object): 
    def __init__(self): 
     self.items = [] 

    def isEmpty(self): 
     return self.items = [] 

    def push(self, item): 
     self.items.append(item) 

    def pop(self): 
     return self.items[-1] 


def getTag(file): 
    EXCEPTIONS = ['br/', 'meta'] 
    s = Stack() 
    balanced = True 
    i = 0 
    isCopying = False 
    currentTag = '' 
    isClosing = False 
    while i < len(file) and balanced: 
     if symbol == "<": 
      if i < (len(file) - 1) and file[i + 1] == "/": 
       i = i + 1 
       isClosing == True 
      isCopying == True 
     if symbol == ">": 
      if isClosing == True: 
       top = s.pop() 
       if not matches(top, symbol): 
        balanced = False 
      else: 
       **strong text** 
       s.push(currentTag) 
      currentTag = '' 
      isCopying == False 
     if isCopying == True: 
      currentTag += symbol 

的代碼讀取該文件中,並通過信函信去搜索<string>。如果存在,則將其推入堆棧。 matches函數檢查結束語句是否等於開頭語句。例外列表是我必須檢查的那些將會把串放置在堆棧上的東西。我正在嘗試將它們合併到我的代碼中,這很困難。有任何想法嗎?在我推入堆棧之前,我應該通過一個過濾器系統來查看該語句是否有效或無效。基本的if語句應該足夠了。

回答

1

如果我正確地閱讀了你的要求,你會對此非常尷尬。你真正想要做的是tokenize你的文件,所以你應該做的第一件事是獲取文件中的所有標記,然後然後檢查它是否是令牌的有效排序。

令牌化意味着您通過文件解析並查找所有有效令牌並將其放入有序列表中。您的案例中的有效令牌是以<開頭並以>結尾的任何字符串長度。你可以放心地丟棄我認爲的其他信息?如果你有一個Token類包含你的令牌類型,那將是最簡單的。

一旦你的令牌的有序列表是更容易,以確定他們是否是「正確順序」用你的籌碼:

is_correct_ordering算法:

For each element in the list 
    if the element is an open-token, put it on the stack 
    if the element is a close-token 
    if the stack is empty return false 
    if the top element of the stack is a matching close token 
     pop the top element of the stack 
    else return false 
    discard any other token 
If the stack is NOT empty, return false 
Else return true 

當然,有一個合理的Token類結構使事情變得簡單:

class Token: 
    def matches(t: Token) -> bool: 
     pass # TODO Implement 

    @classmethod 
    def tokenize(token_string: str) -> Token: 
     pass # TODO Implement to return the proper subclass instantiation of the given string 

class OpenToken: 
    pass 

class CloseToken: 
    pass 

class OtherToken: 
    pass 

這將挑戰分爲兩部分:首先解析文件中的所有有效令牌(易於驗證,因爲您可以手動比較有序列表和文件中看到的內容),然後驗證有序列表是否正確。注意,這裏也可以簡化你的工作委派給一個子程序的工作內容:

def tokenize_file(file) -> list: 
    token_list = [] 

    while i < len(file): 
     token_string, token_end = get_token(file[i:]) 
     token_list.append = Token.tokenize(token_string) 
     i = i + token_end # Skip to the end of this token 

    return token_list 

def get_token(file) -> tuple: 
    # Note this is a naive implementation. Consider the edge case: 
    # <img src="Valid string with >"> 
    token_string = "" 
    for x in range(len(file)): 
     token_string.append(file[x]) 
     if file[x] == '>': 
      return token_string, x 
    # Note that this function will fail if the file terminates before you find a closing tag! 

上面應該把這樣的事情:

<html>Blah<meta src="lala"/><body><br/></body></html> 

分爲:

[OpenToken('<html>'), 
OtherToken('<meta src="lala"/>'), 
OpenToken('<body>'), 
OtherToken('<br/>'), 
CloseToken('</body>'), 
CloseToken('</html>')] 

哪個可以更容易地處理,以確定正確性。

很明顯,這不是你的問題的完整實現,但希望它能幫助理清你選擇的尷尬與你當前的方向。

+0

啊我從來沒有聽說過令牌化。這是有道理的,如果我試圖針對文件中的某些字符串個案。 –

+0

你*正在試圖針對某些字符串的情況。 –

+0

對不起,我說錯了。我會試試! –