给对象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><td>Hello</td><td>World</td></tr></body></html>
decode_contents()
中尖括号在分配给tr.string
时的位置。
我还尝试了tr.replace_with(str(tr).replace("!", ""))
(使用Tag
对象的HTML表示),其结果相同。
请记住,这是一个简化的示例。在本特定示例中,虽然我可以遍历td
标签,但实际上,这些标签也将包含HTML结构,从而带来相同的问题。
答案 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
的参数