0

我正在尝试使用以下代码生成包含标签的 XML 文件</documents>

string = "dasdd Wonder asdf new single, “Tomorrow” #URL# | " \
    "oiojk asfddsf releases new asdfdf, “gfsg” | " \
    "Identity of asfqw who dasd off asdfsdf Mainland jtyjyjui revealed #URL#"

from yattag import Doc, indent
import html, re

doc, tag, text = Doc().tagtext()
with tag('author', lang='en'):
    with tag('documents'):
        for tweet in string.split(' | '):
            with tag('document'):
                tweet = html.unescape(tweet)
                text('<![CDATA[{}]]'.format(tweet))
result = indent(doc.getvalue(), indentation=' ' * 4, newline='\n')
with open('test.xml', 'w', encoding='utf-8') as f:
    f.write(result)

我想CDATA在文本周围添加标记,但是当我打开生成的文件时使用Notepad++而不是输出为:

<document><![CDATA[oiojk asfddsf releases new asdfdf, “gfsg”]]></document>

它看起来像(带有 HTML 实体):

<document>&lt;![CDATA[oiojk asfddsf releases new asdfdf, “gfsg”]]</document>

我尝试使用HTML库(html.unescape行)来丢弃 HTML 实体,但我做不到。

我该如何解决这个编码问题?

4

1 回答 1

1

text方法始终将 '<' 替换为&lt;. 如果您不想进行这种转义,则可以改用该asis方法(它“按原样”插入字符串)。cdata但是,在您的情况下,使用 Yattag 的方法会更合适。

from yattag import Doc
help(Doc.cdata)

cdata(self, strg, safe=False) 附加一个包含所提供字符串的 CDATA 部分。

您不必担心]]>会终止 CDATA 部分的潜在序列。它们被替换为]]]]><![CDATA[>.

如果您确定您的字符串不包含]]>,则可以通过safe = True. 如果你这样做,你的字符串将不会被搜索]]>序列。

所以,在你的情况下,你可以这样做:

for tweet in string.split(' | '):
    with tag('document'):
        tweet = html.unescape(tweet)
        doc.cdata(tweet)
于 2020-02-17T16:24:20.667 回答