0

我正在尝试在 Python 中编写一些代码,这将简单地从字符串输入中删除任何 HTML 标记。但由于某种原因,代码不会在我的家庭 Python 安装上执行(只是挂起),并在 Udacity 界面上被杀死。

我哪里错了?

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>''')
4

2 回答 2

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()
于 2012-08-30T18:19:41.653 回答
1

您正在进行替换,但没有将结果存储在任何地方,因此它丢失了。我假设你的意思是这样的:

sentence = sentence.replace(chamber,'')

代替:

sentence.replace(chamber,'')

字符串在 Python 中是不可变的,因此不能“就地”修改。始终会创建一个新字符串,因此如果要保留它,则必须为其分配一个名称。

只有在文本中找不到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 标签的属性中有任何符号,这个小功能将无法去除您想要的内容。相反,请考虑使用 HTML 解析器(例如 BeautifulSoup)来执行此操作。

于 2012-08-30T18:19:23.230 回答