gpt4 book ai didi

python - 在 HTML BeautifulSoup 中按文本查找和替换

转载 作者:太空狗 更新时间:2023-10-29 21:50:21 24 4
gpt4 key购买 nike

我正在尝试使用 python 和 BeautifulSoup 标记一个 HTML 文件(字面意思是将字符串包装在“标记”标签中)。问题大致如下……

假设我有我的原始 html 文档:

test = "<h1>oh hey</h1><div>here is some <b>SILLY</b> text</div>"

我想对该文档中的字符串进行不区分大小写的搜索(忽略 HTML)并将其包装在“mark”标签中。所以假设我想在 html 中找到“这里有一些愚蠢的文本”(忽略粗体标签)。我想采用匹配的 html 并将其包装在“标记”标签中。

例如,如果我想在test中搜索“here is some silly text”,所需的输出是:

"<h1>oh hey</h1><div><mark>here is some <b>SILLY</b> text</mark></div>"

有什么想法吗?如果使用 lxml 或正则表达式更合适,我也愿意接受这些解决方案。

最佳答案

>>> soup = bs4.BeautifulSoup(test)
>>> matches = soup.find_all(lambda x: x.text.lower() == 'here is some silly text')
>>> for match in matches:
... match.wrap(soup.new_tag('mark'))
>>> soup
<html><body><h1>oh hey</h1><mark><div>here is some <b>SILLY</b> text</div></mark></body></html>

我必须将函数作为 name 传递给 find_all 的原因是比较 x.text.lower(),而不仅仅是将 text 参数与比较 x.lower() 的函数一起使用,是后者在某些情况下找不到您显然想要的内容。

wrap 函数在某些情况下可能无法以这种方式工作。如果没有,您将不得不改为 enumerate(matches),并设置 matches[i] = match.wrap(soup.new_tag('mark')) . (您不能使用 replace_with 将标签替换为引用自身的新标签。)

另请注意,如果您的预期用例允许任何非 ASCII 字符串匹配 'here is some silly text'(或者如果您想要扩展代码以处理非 ASCII 搜索字符串),上面使用 lower() 的代码可能不正确。您可能需要调用 str.casefold() 和/或 locale.strxfrm(s) 和/或使用 locale.strcoll(s, t) 而不是使用 ==,但您必须了解您想要什么以及如何获得它才能选择正确的答案。

关于python - 在 HTML BeautifulSoup 中按文本查找和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16800201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com