Игнорировать юникод в xml с python и lxml? - PullRequest
1 голос
/ 13 марта 2012

Я хочу игнорировать юникод в моем XML. Я готов как-то изменить это и в обработке вывода.

Мой питон:

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)

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

Ответы [ 2 ]

5 голосов
/ 13 марта 2012

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

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

Я рекомендую прочитать Джоэлс Абсолютный минимум, который должен знать каждый разработчик программного обеспечения. Абсолютно, положительно должен знать о юникоде и наборах символов (без извинений!) , за которыми следуют соответствующие главы о строках кодирования и декодирования в Документы Python .

Вот небольшой совет, с которого можно начать:

print "docID:    {0}\nCitation: {1}\n".format(docID.encode("UTF-8"),
                                              target.encode("UTF-8"))
1 голос
/ 13 марта 2012

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

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

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

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

...