Вы можете попробовать выполнить итерацию по всем строковым объектам, которые являются потомками <tr>
.
import bs4
soup = bs4.BeautifulSoup("<table><tr><td>Hello!</td><td>World!</td></tr></table>")
for tr in soup.find_all("tr"):
strings = list(tr.strings)
for s in strings:
new_str = s.replace("!", "")
s.replace_with(new_str)
Одна проблема заключается в том, что вы не можете заменить строки, возвращенные на .strings
, не прерывая итератор,вот почему я сделал его первым.Если это проблема, вы можете выполнить итерацию таким образом, чтобы сохранить следующий элемент перед его заменой, например:
def iter_strings(elem):
# iterate strings so that they can be replaced
iter = elem.strings
n = next(iter, None)
while n is not None:
current = n
n = next(iter, None)
yield current
def replace_strings(element, substring, newstring):
# replace all found `substring`'s with newstring
for string in iter_strings(element):
new_str = string.replace(substring, newstring)
string.replace_with(new_str)
for tr in soup.find_all("tr"):
replace_strings(soup, "!", "")