2012-03-12 3 views
1

Я ищу либо игнорировать unicode в моем xml. Я готов как-то изменить его и при обработке вывода.Игнорировать unicode в xml с помощью python и lxml?

Мой питон:

import urllib2, os, zipfile 
from lxml import etree 

doc = etree.XML(item) 
docID = "-".join(doc.xpath('//publication-reference/document-id/*/text()')) 
target = doc.xpath('//references-cited/citation/nplcit/*/text()') 
#target = '-'.join(target).replace('\n-','') 
print "docID: {0}\nCitation: {1}\n".format(docID,target) 
outFile.write(str(docID) +"|"+ str(target) +"\n") 

Создает выход:

docID: US-D0607176-S1-20100105 
Citation: [u"\u201cThe birth of Lee Min Ho's donuts.\u201d Feb. 25, 2009. Jazzholic. Apr. 22, 2009 <http://www 

Но если я пытаюсь добавить обратно в '-'join(target).replace('\n-','') я получаю эту ошибку для обоих print и outFile.write:

Traceback (most recent call last): 
    File "C:\Documents and Settings\mine\Desktop\test_lxml.py", line 77, in <module> 
    print "docID: {0}\nCitation: {1}\n".format(docID,target) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 0: ordinal not in range(128) 

Как я могу игнорировать unicode, чтобы я мог вывести target с outFile.write?

+1

Что происходит, когда вы делаете 'из __future__ import unicode_literals'? –

ответ

4

Вы получаете эту ошибку, потому что у вас есть строка с символами юникода, которые вы пытаетесь вывести, используя набор символов ascii. При печати списка вы получаете «реестр» списков и строки внутри него, избегая проблемы.

Вам необходимо либо закодировать на другой набор символов (например, UTF-8), либо вычеркнуть или заменить недопустимые символы при кодировании.

Рекомендую прочитать Joels The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!), а затем соответствующие главы о кодировании и декодировании строк в the Python docs.

Вот небольшой намек, чтобы вы начали:

print "docID: {0}\nCitation: {1}\n".format(docID.encode("UTF-8"), 
               target.encode("UTF-8")) 
+0

Да. Это срабатывало, когда я просто добавил '.encode (« UTF-8 »)' в коды вывода 'print' и' write'. Спасибо! –

0

print "docID: {0}\nCitation: {1}\n".format(docID.encode("utf-8"), target.encode("utf-8"))

Все символы, которые не в наборе ASCII символов будут отображаться как шестнадцатеричное экранирующие последовательности: например, «\ u201c» появится как «\ xe2 \ x80 \ x9c». Если это неприемлемо, то вы можете сделать : «»

docID = "".join([a if ord(a) < 128 else '.' for a in x])

который заменит все символы не-ASCII с.

Смежные вопросы