BeautifulSoup - изменить содержимое тега - PullRequest
0 голосов
/ 13 июня 2019

Учитывая объект soup со значением bs4.BeautifulSoup("<tr><td>Hello!</td><td>World!</td></tr>"), как мне удалить восклицательные знаки со всех тегов tr?

Самое близкое, что у меня есть:

for tr in soup.find_all("tr"):
    tr.string = tr.decode_contents().replace("!", "")

Но это приводит к:

<html><body><tr>&lt;td&gt;Hello&lt;/td&gt;&lt;td&gt;World&lt;/td&gt;</tr></body></html>

Где угловые скобки в decode_contents() кодируются при присвоении tr.string.

Я также пытался tr.replace_with(str(tr).replace("!", "")) (используя HTML-представление Tag объектов), который дает тот же результат.

Помните, что это упрощенный пример. Хотя в этом конкретном примере я мог бы перебирать теги td, в действительности эти теги также содержали бы структуры HTML, представляющие ту же проблему.

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Вы можете попробовать выполнить итерацию по всем строковым объектам, которые являются потомками <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, "!", "")
0 голосов
/ 13 июня 2019

Сделал следующее:

import bs4

soup = bs4.BeautifulSoup("<tr><td>Hello!</td><td>World!</td></tr>", "html.parser")

for tr in soup.find_all("tr"):
    replaced_tr = str(tr).replace("!", "")
    modified_tr = bs4.BeautifulSoup(replaced_tr, "html.parser").tr
    tr.replace_with(modified_tr)

Кажется, replace_with не работает со строками HTML, поэтому вы должны сначала создать объект BeautifulSoup и использовать его в качестве аргумента replace_with

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...