Python BeautifulSoup replaceWith()方法添加转义html,希望它不被转义

Python BeautifulSoup replaceWith()方法添加转义html,希望它不被转义,python,django,beautifulsoup,Python,Django,Beautifulsoup,我有一个python方法(),它接受一些html并包装,这个方法是未格式化的,应该格式化:http://google.ca 结果返回文本(由第二个print语句输出)如下所示: 这是一个已格式化的链接,该链接未格式化,应该格式化:a href=”http://google.ca"http://google.ca/a 如您所见,它正在格式化链接,但它使用转义的html进行格式化,因此当我在模板{{my.html | safe}}中打印它时,它不会呈现为html 那么,我如何才能使这些用urli

我有一个python方法(),它接受一些html并包装
,这个方法是未格式化的,应该格式化:http://google.ca
结果返回文本(由第二个print语句输出)如下所示:

这是一个已格式化的链接,该链接未格式化,应该格式化:a href=”http://google.ca"http://google.ca/a
如您所见,它正在格式化链接,但它使用转义的html进行格式化,因此当我在模板
{{my.html | safe}}
中打印它时,它不会呈现为html

那么,我如何才能使这些用urlize添加的标记不被扫描,并正确地呈现为html呢?我怀疑这与我使用它作为方法而不是模板过滤器有关?我实际上找不到这个方法的文档,它没有出现在中


编辑:转义似乎实际发生在这一行:
textNode.replaceWith(urlizedText)

这似乎是您试图使用BeautifulSoup将文本节点替换为包含HTML实体的文本节点的地方

实现所需的一种方法是使用urlize的输出构建一个新字符串(它似乎并不关心链接是否已经格式化)

但是,如果您只想在模板中呈现它,您可以在输入字符串上调用urlize作为模板标记-

{{input_string|urlize}}

您可以将urlizedText字符串转换为一个新的BeautifulSoup对象,它本身将被视为一个标记,而不是一个标记中的文本(正如您所期望的那样进行转义)


来自文档:“如果将urlize应用于已经包含HTML标记的文本,则无法按预期工作。仅将此筛选器应用于纯文本。”因此,
{{input_string | urlize}}
无法工作。正如我在问题和示例文本中提到的,我从html开始。我尝试了fragment方法,它正确地格式化了链接,但是它删除了第一个已经格式化的链接!(参见问题中的示例文本)我编辑了我的答案,以包括您对现有标记的检查。似乎对你的示例文本有效。好吧,也许我搞砸了,我测试时包括了支票,但我会再试一次。差不多了,谢谢!因此,这对示例文本有效,但因为您删除了soup,它只会构建textnodes,所有其他html(非文本节点)都会从html中剥离:


等等。
this is a formatted link <a href="http://google.ca">http://google.ca</a>, this one is unformatted and should become formatted: http://google.ca
this is a formatted link <a href="http://google.ca">http://google.ca</a>, this one is unformatted and should become formatted: &lt;a href="http://google.ca"&gt;http://google.ca&lt;/a&gt;
from django.utils.html import urlize
from bs4 import BeautifulSoup

def html_urlize(self, text):
    soup = BeautifulSoup(text, "html.parser")

    finalFragments = []
    textNodes = soup.findAll(text=True)
    for textNode in textNodes:
        if getattr(textNode.parent, 'name') == 'a':
            finalFragments.append(str(textNode.parent))
        else:
            finalFragments.append(urlize(textNode))

    return str("".join(finalFragments))
{{input_string|urlize}}
from django.utils.html import urlize
from bs4 import BeautifulSoup

def html_urlize(self, text):
    soup = BeautifulSoup(text, "html.parser")

    print(soup)

    textNodes = soup.findAll(text=True)
    for textNode in textNodes:
        if textNode.parent and getattr(textNode.parent, 'name') == 'a':
            continue  # skip already formatted links
        urlizedText = urlize(textNode)
        textNode.replaceWith(BeautifulSoup(urlizedText, "html.parser"))

    print(soup)

    return str(soup)