0

文字列入力からHTMLタグを削除するだけのコードをPythonで作成しようとしています。しかし、何らかの理由で、私のホーム 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 タグの属性にシンボルが含まれている場合、この小さな関数は必要なものを取り除くことができません。代わりに、BeautifulSoup などの HTML パーサーを使用してこれを行うことを検討してください。

于 2012-08-30T18:19:23.230 に答える