似乎无法呈现XML或干净的字符

时间:2016-05-09 13:09:03

标签: python xml

我正在尝试使用sitemap.xml渲染我的flask,但是我似乎无法清理输入,以便渲染可以正常工作。错误如下:

error on line 23325 at column 83: PCDATA invalid Char value 11

我正在使用的代码是:

url = prepend + "/explore/"+str(result['id'])+"/"+result['title'].encode('utf-8', 'xmlcharrefreplace').decode('utf-8')

我也试过了:

url = prepend + "/explore/"+str(result['id'])+"/"+result['title'].encode('ascii', 'xmlcharrefreplace').decode('ascii')

同样删除Char 11的内容似乎也不起作用。

result["title"] = result["title"].replace('', '')

是否有更聪明的方法可以清理任何虚假角色或更准确地解决问题?

我试图标记问题。它看起来像换行或沿着那些线条的东西。我在构建URL之前和之后都尝试过。

XX XXX XXX XXX  
                Step by step guide

但是,我在python军械库中找不到任何删除换行符的内容。我正在尝试,replace('\r', '')strip()等等,但这仍然存在。

1 个答案:

答案 0 :(得分:4)

“字符值11”(十六进制为0xB)是指垂直标签\v回车\r也不换行\n

垂直标签为not a valid character in an XML document。这是无效的,你甚至不能将它表示为之类的字符引用。你必须自己从字符串中删除它:

result["title"] = result["title"].replace('\x0b', '')

当你在它的时候,你可能也想要删除其他无效字符,因为它们倾向于在用户提供的数据中突然出现,并在生产中咬你。我不知道常见的库函数,所以我提出了自己的函数,使XML和HTML5或多或少都快乐:

import re

def printable(s):
    # Based on `XML 1.0 section 2.2 <https://www.w3.org/TR/xml/#charsets>`_,
    # with the addition of U+0085,
    # which the W3C (Nu) validator also marked as a "forbidden code point".
    # Even with this code, the validator still complains about
    # "Text run is not in Unicode Normalization Form C"
    # and "Document uses the Unicode Private Use Area(s)".
    return re.sub(
        pattern=(u'[\u0000-\u0008\u000B\u000C\u000E-\u001F'
                 u'\u007F-\u009F\uD800-\uDFFF\uFDD0-\uFDEF\uFFFE\uFFFF]'),
        repl=u'\N{REPLACEMENT CHARACTER}',
        string=s
    )

至于xmlcharrefreplace,这根本不是你想要的。它不是XML无效字符的转义机制。这是一种保留所选编码之外的字符的方法。在这样的情况下这是有道理的:

>>> print(u'Liberté, égalité, fraternité!'.encode('ascii', 'xmlcharrefreplace'))
Libert&#233;, &#233;galit&#233;, fraternit&#233;!