我正在尝试使用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()
等等,但这仍然存在。
答案 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é, égalité, fraternité!