2017-01-05 2 views
1

Я следующий элемент в моем словаре:Фиксирующие недопустимые символы XML

d = {'Name': 'La vie r\xc3\xaav\xc3\xa9e de Gaspard'} 

Печать названия или вставив его непосредственно в моей базе данных работает отлично:

>>> print d['Name'] 
La vie rêvée de Gaspard 

Однако, если добавить к этому мой xml, я получаю следующую ошибку:

ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters 

Как бы исправить это?

+0

Какую версию питона? – Vlad

+0

Также как вы добавляете его в XML? – Vlad

ответ

3

'La vie r\xc3\xaav\xc3\xa9e de Gaspard' - это bytestring, поэтому вам нужно декодировать его в unicode, как предполагает исключение.

>>> from lxml import etree 
>>> d = {'Name': 'La vie r\xc3\xaav\xc3\xa9e de Gaspard'} 
>>> e = etree.Element('root') 
>>> e.set('name', d['Name']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "lxml.etree.pyx", line 746, in lxml.etree._Element.set (src/lxml/lxml.etree.c:42970) 
    File "apihelpers.pxi", line 547, in lxml.etree._setAttributeValue (src/lxml/lxml.etree.c:19025) 
    File "apihelpers.pxi", line 1395, in lxml.etree._utf8 (src/lxml/lxml.etree.c:26485) 
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters 

>>> e.set('name', d['Name'].decode('utf-8')) 
>>> etree.tostring(e) 
'<root name="La vie r&#234;v&#233;e de Gaspard"/>' 

То же самое относится и к установке атрибута текста элемента:

>>> e = etree.Element('root') 
>>> e.text = d['Name'].decode('utf-8') 
>>> etree.tostring(e) 
'<root>La vie r&#234;v&#233;e de Gaspard</root>' 
+0

Это очень полезно, спасибо. Был бы способ определить, требуется ли это другим способом, кроме 'try: d ['Name'], кроме ValueError: d ['Name']. Decode ('utf-8')'? Например, тернарный оператор, если он может быть декодирован в utf-8. – David542

+0

@ David542 это зависит от вашей ситуации. Если вы уверены, что весь текст будет utf-8 или ascii, вы можете просто декодировать в любом случае. Если текст может иметь произвольную кодировку, то, возможно, для определения кодировки можно использовать библиотеку, например, chardet. – snakecharmerb