域名注册好了怎么做网站,国家住房建设部网站,wordpress邮箱注册,微信朋友圈投放广告怎么收费在 ElementTree 中#xff0c;你可以使用 Element 对象的方法来创建新的标签#xff0c;并将其嵌入到现有的 XML 结构中。下面是一个简单的示例#xff0c;演示了如何在 ElementTree 文本中嵌入新的标签#xff1a; 1、问题背景
我正在使用Python ElementTree模块来处理HT…在 ElementTree 中你可以使用 Element 对象的方法来创建新的标签并将其嵌入到现有的 XML 结构中。下面是一个简单的示例演示了如何在 ElementTree 文本中嵌入新的标签 1、问题背景
我正在使用Python ElementTree模块来处理HTML。我想强调某些单词我目前的解决方案是使用一个循环来遍历tree.getiterator()中的每个元素然后分别处理’text’和’tail’属性。如果找到要强调的单词就把它替换为带有标签的相同单词。
但是这种方法存在两个问题
它在text属性中嵌入了HTML标签当渲染时会被转义因此我需要用代码对标签进行反转义。它需要移动’text’和’tail’属性以便强调的文本出现在相同的位置。当我们像上面那样迭代时这将非常棘手。
2、解决方案
方法一使用XSLT和自定义XPath函数
from lxml import etreestylesheet etree.XML(xsl:stylesheet version1.0xmlns:btesturi:bolderxmlns:xslhttp://www.w3.org/1999/XSL/Transformxsl:template match*xsl:copy //xsl:templatexsl:template match*xsl:element name{name(.)}xsl:copy-of select* /xsl:apply-templates selecttext() /xsl:apply-templates select./* //xsl:element/xsl:templatexsl:template matchtext()xsl:copy-of selectbtest:bolder(.)/node() //xsl:template /xsl:stylesheet
)glossary [some, bold]def bolder(context, s):results []r Nonefor 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 wordb.tail results.append(r)r Noneelse: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 resultsdef test():ns etree.FunctionNamespace(uri:bolder) # register global namespacens[bolder] bolder # define function in new global namespacetransform etree.XSLT(stylesheet)print str(transform(etree.XML(htmlhead/headbodyphere is some text to bold/ppand some more/p/body/html)))if __name__ __main__:test()方法二使用DOM解析器
from xml.dom import minidom
import rews_split re.compile(r\s, re.U).splitdef processNode(parent):doc parent.ownerDocumentfor node in parent.childNodes[:]:if node.nodeTypenode.TEXT_NODE:words ws_split(node.nodeValue)new_words []changed Falsefor word in words:if word in glossary:text .join(new_words[])parent.insertBefore(doc.createTextNode(text), node)b doc.createElement(b)b.appendChild(doc.createTextNode(word))parent.insertBefore(b, node)new_words []changed Trueelse:new_words.append(word)if changed:text .join(new_words)print textparent.replaceChild(doc.createTextNode(text), node)else:processNode(node)我希望这些解决方案对您有用。
在这个示例中我们首先创建了一个根元素 root然后创建了一个子元素 child并设置了其文本内容。接着我们创建了一个新的标签 new_tag并将其嵌入到子元素 child 中。最后我们将整个 XML 结构写入到文件中。
运行以上代码后将会生成一个名为 example.xml 的文件其内容如下
rootchildThis is some text.new_tagNew tag content/new_tag/child
/root这就是如何在 ElementTree 文本中嵌入新的标签。你可以根据自己的需求和数据结构使用类似的方法来创建和嵌入标签。