BeautifulSoup-修改标签的内容

时间:2019-06-13 17:42:37

标签: python html python-3.x beautifulsoup

给对象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("!", ""))(使用Tag对象的HTML表示),其结果相同。

请记住,这是一个简化的示例。在本特定示例中,虽然我可以遍历td标签,但实际上,这些标签也将包含HTML结构,从而带来相同的问题。

2 个答案:

答案 0 :(得分:1)

您可以尝试遍历<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, "!", "")

答案 1 :(得分:0)

执行以下操作:

dlib::correlation_tracker

似乎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) 不适用于HTML字符串,因此您应该首先创建一个replace_with对象,并将其用作BeautifulSoup的参数