【问题标题】:editing tag.string property with BeautifulSoup (bs4) to string including markup使用 BeautifulSoup (bs4) 将 tag.string 属性编辑为包含标记的字符串
【发布时间】:2020-01-14 13:53:33
【问题描述】:

我有一个要编辑的 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 标签,这是因为如果我查看源代码,标签实际上由&amp;gt; 表示。这似乎来自“link.string = match(link.string, searchQuery)”这一行——我想这很有意义,因为 BeautifulSoup 正在进行类型检查并确保标签中唯一的内容。 string 字段确实是一个字符串。我想理想的最终状态是从标签中创建一个分支以包含子标签。

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

【问题讨论】:

  • 打电话给return str(html).replace("&amp;gt;","&gt;").replace("&amp;lt","&lt;"), 200怎么样?
  • @Kristian 是的,可以。谢谢!这是那些日子之一......
  • 我已经更新了我的答案以展示更好的方法

标签: html python-3.x flask beautifulsoup


【解决方案1】:

为了快速修复,只需用 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 特殊字符不只是 &amp;lt;&amp;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 语句(模块名称)可能有点不同

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2013-05-28
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多