使用 BeautifulSoup (bs4) 编辑 tag.string 属性以包含标记的字符串



我有一个 html 文档,我希望对其进行编辑,以便其中的任何单词都可以突出显示/加粗。

我在内存中有html,并已传递给BeautifulSoup。我遍历所有标签并获取它们的字符串元素。如果任何字符串包含匹配的单词,我会编辑该字符串并将其替换为 html 中,并在所需单词周围环绕标记。

from flask import Flask, Markup
from bs4 import BeautifulSoup
def match( documentText: str, searchQuery: str) -> Markup:
words = documentText.split( ' ')
if len( words) >= 3:
words[2] = f'<strong>{ words[2]}</strong>'
logger.info( f'{ words=}')
return Markup( ' '.join( words))
for link in html.find_all( True):
if ( link.string):
link.string = match( link.string, searchQuery)
app = Flask( __name__)
@app.route( '/')
def home():
logger.info( 'trying markup and testing logging') 
return str( html), 200
app.run( debug=True)

现在,我不是在我想要的地方呈现带有粗体字的页面,而是直观地看到 html 标签,这是因为如果我查看源代码,标签实际上由&gt;表示。这似乎来自"link.string = match( link.string, searchQuery("行 - 我想这很有意义,因为 BeautifulSoup 正在进行类型检查并确保 tag.string 字段中唯一的东西确实是一个字符串。我想理想的最终状态是使标签上的分支包含子标签。

这是其他人以前解决过的问题吗?我对整个事情的解决方案似乎笨重且不优雅,所以如果有人有更好的路线,我不介意更好的路线。

为了快速修复,只需用str.replace((替换回那些html特殊字符

from flask import Flask, Markup
from bs4 import BeautifulSoup
# ...
@app.route( '/')
def home():
logger.info( 'trying markup and testing logging') 
return str(html).replace("&gt;",">").replace("&lt","<"), 200
app.run( debug=True)

请注意,因为html特殊字符不仅仅是&lt;&gt;

HTML 特殊字符参考:https://www.html.am/reference/html-special-characters.cfm

更好的方法:

此方法会将所有 html 特殊字符更改回其未转义的形式

import html.parser
htmlparser = html.parser.HTMLParser()
html_decoded_string = parser.unescape(str(html))
return html_decoded_string , 200

请注意,在 Python 2 上,import 语句(模块名称(可能略有不同

最新更新