2012-08-30 49 views
0

我想在Python中編寫一些東西,它只是從字符串輸入中刪除任何HTML標記。但由於某種原因,代碼將無法執行(簡單地掛起)在我的家庭Python安裝,並在Udacity界面上被殺死。Python中的基本搜索和替換不是執行

我哪裏錯了?

def remove_tags(sentence): 
    list = [] 
    state = 0 
    while state == 0: 
     location1 = sentence.find('<') 
     location2 = sentence.find('>',location1) 
     if location1 != -1: 
      chamber = sentence[location1:location2+1] 
      sentence.replace(chamber,'') 
     elif location1 == -1: 
      state = 1 
      return sentence.split() 
    return sentence.split() 

print remove_tags('''<table cellpadding='3'> 
        <tr><td>Hello</td><td>World!</td></tr> 
        </table>''') 

回答

1

你正在做替換,但沒有在任何地方存儲結果,所以它會丟失。我假設你的意思是這樣的:的

sentence = sentence.replace(chamber,'') 

代替:

sentence.replace(chamber,'') 

字符串是Python中不可改變的,因此不能modfied「到位」。一個新的字符串總是被創建,因此如果它被保留,則必須將其分配給一個名稱。

while循環將唯一的出口(通過return語句),如果沒有找到文本<,這永遠不會發生,除非文本中不包含<字符以來開始了,剛纔描述,你永遠不會改變sentence的價值。

我還會提到你的elif是多餘的。您可以在那裏使用else並省略條件,因爲它與if中的那個相反。此外,對於這個問題,沒有必要使用state變量或list(這是一個不好的名字)。

我已經重寫你的函數是這樣的:

def remove_tags(html): 
    while '<' in html: 
     start = html.find('<') 
     end = html.find('>', start) 
     tag = html[start:end+1] 
     html = html.replace(tag, '', 1) 
    return html.split() 

我也改變了你的變量名,以更好地反映他們已經習慣的東西。

當然,如果您在HTML標記的屬性中有任何>符號,這個小函數將無法剝離您想要的東西。相反,請考慮使用諸如BeautifulSoup之類的HTML解析器來執行此操作。

+0

謝謝!問題解決了。;) – c3ntury

2

爲了使while循環終止,您將需要包含一條更改值爲state的語句。

就這樣,您正在等待sentence中沒有'<'字符,並從while循環中返回。因爲你永遠不會改變sentence的價值,所以你永遠不會碰到return

我覺得這段代碼令人困惑,因爲你使用的是state變量,但是看起來你打算將循環變爲無限循環,而退出不是發生在while中,而是來自循環內部。如果這是你的意圖,那麼while True會更清楚地表明。

但是,我認爲最清晰的版本將是while '<' in sentence:。您可以免去內部if聲明:

while '<' in sentence: 
    location1 = sentence.find('<') 
    location2 = sentence.find('>',location1) 
    chamber = sentence[location1:location2+1] 
    sentence = sentence.replace(chamber,'') 

return sentence.split() 
+0

對不起,我錯過了添加到帖子中時改變狀態的一行。該代碼仍然不會令人遺憾地產生結果。 :/ – c3ntury

+0

選擇一個控制結構 - 「while」或內部「return」,並堅持。這種方式太混亂了(至少對於像我這樣的addlepate)來說。 –