Python - найдите текст, используя beautifulSoup, затем замените в оригинальной переменной супа

commentary = soup.find('div', {'id' : 'live-text-commentary-wrapper'})
findtoure = commentary.find(text = re.compile('Gnegneri Toure Yaya')).replace('Gnegneri      Toure Yaya', 'Yaya Toure')

Комментарий содержит различные примеры Гнегнери Туре Яйи, которые нуждаются в переходе на Яя Туре.

findAll() не работает, так как findtoure - это список.

Другая проблема заключается в том, что этот код просто находит их и заменяет их на новую переменную, называемую findtoure, мне нужно заменить их в оригинальном супе.

Думаю, я просто смотрю на это с неправильной точки зрения.

Ответ 1

Вы не можете делать то, что хотите, только с помощью .replace(). Из документации BeautifulSoup на NavigableString:

Вы не можете отредактировать строку на месте, но вы можете заменить одну строку на другую, используя replace_with().

Это именно то, что вам нужно сделать; возьмите каждое соответствие, затем вызовите .replace() в содержащемся тексте и замените оригинал на это:

findtoure = commentary.find_all(text = re.compile('Gnegneri Toure Yaya'))
for comment in findtoure:
    fixed_text = unicode(comment).replace('Gnegneri Toure Yaya', 'Yaya Toure')
    comment.replace_with(fixed_text)

Если вы хотите использовать эти комментарии дальше, вам нужно будет сделать новую находку:

findtoure = commentary.find(text = re.compile('Yaya Toure'))

или, если вам все, что вам нужно, это результирующий текст unicode (так что не подключены NavigableString объекты), просто соберите объекты fixed_text:

findtoure = commentary.find_all(text = re.compile('Gnegneri Toure Yaya'))
fixed_comments = []
for comment in findtoure:
    fixed_text = unicode(comment).replace('Gnegneri Toure Yaya', 'Yaya Toure')
    comment.replace_with(fixed_text)
    fixed_comments.append(fixed_text)