gpt4 book ai didi

python - 在 ElementTree 文本中插入标签

转载 作者:太空宇宙 更新时间:2023-11-04 11:04:59 24 4
gpt4 key购买 nike

我正在使用 Python ElementTree操作 HTML 的模块。我想强调某些词,我目前的解决方案是:

for e in tree.getiterator():
for attr in 'text', 'tail':
words = (getattr(e, attr) or '').split()
change = False
for i, word in enumerate(words):
word = clean_word.sub('', word)
if word.lower() in glossary:
change = True
words[i] = word.replace(word, '<b>' + word + '</b>')
if change:
setattr(e, attr, ' '.join(words))

上面检查了每个元素的文本并强调了它找到的重要词。然而,它通过在文本属性中嵌入 HTML 标记来实现这一点,该标记在呈现时被转义,因此我需要反击:

html = etree.tostring(tree).replace('&gt;', '>').replace('&lt;', '<')

这让我很不舒服,所以我想好好做。但是,要嵌入一个新元素,我需要围绕“文本”和“尾部”属性进行移动,以便强调的文本出现在相同的位置。当如上迭代时,这将非常棘手。

任何如何正确执行此操作的建议将不胜感激。我确定我在 API 中遗漏了一些东西!

最佳答案

您还可以使用 xslt 和自定义 xpath 函数来执行此操作。

下面显示的是一个例子。它仍然需要一些工作,例如清理元素末尾的额外空白和处理混合文本,但这是另一个想法。

给定这个输入:


<html>
<head>
</head>
<body>
<p>here is some text to bold</p>
<p>and some more</p>
</body>
</html>

词汇表包含两个词:some, bold

然后示例输出是:


<?xml version="1.0"?>
<html>
<head/>
<body>
<p>here is <b>some</b> text to <b>bold</b> </p>
<p>and <b>some</b> more </p>
</body>
</html>

这是代码,我也把它贴在了http://bkc.pastebin.com/f545a8e1d


from lxml import etree

stylesheet = etree.XML("""
<xsl:stylesheet version="1.0"
xmlns:btest="uri:bolder"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@*">
<xsl:copy />
</xsl:template>

<xsl:template match="*">
<xsl:element name="{name(.)}">
<xsl:copy-of select="@*" />
<xsl:apply-templates select="text()" />
<xsl:apply-templates select="./*" />
</xsl:element>
</xsl:template>

<xsl:template match="text()">
<xsl:copy-of select="btest:bolder(.)/node()" />
</xsl:template>
</xsl:stylesheet>
""")

glossary = ['some', 'bold']

def bolder(context, s):
results = []
r = None
for word in s[0].split():
if word in glossary:
if r is not None:
results.append(r)
r = etree.Element('r')
b = etree.SubElement(r, 'b')
b.text = word
b.tail = ' '
results.append(r)
r = None
else:
if r is None:
r = etree.Element('r')
r.text = '%s%s ' % (r.text or '', word)

if r is not None:
results.append(r)
return results

def test():
ns = etree.FunctionNamespace('uri:bolder') # register global namespace
ns['bolder'] = bolder # define function in new global namespace
transform = etree.XSLT(stylesheet)
print str(transform(etree.XML("""<html><head></head><body><p>here is some text to bold</p><p>and some more</p></body></html>""")))

if __name__ == "__main__":
test()

关于python - 在 ElementTree 文本中插入标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973026/

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