Мой скрипт очень часто использует .encode ('utf-8'). Я чувствую, что я что-то делаю неправильно

Проблема с этим скриптом заключается в том, что я должен продолжать звонить .encode('utf-8') и это не кажется мне очень дзэн. Я должен делать что-то неправильно.

 # -*- coding: utf-8 -*- """ Simple rss to html converter """ __version__ = "0.0.1" __author__ = "Ricky L Wilson" import StringIO from feedparser import parse as parsefeed from bs4 import BeautifulSoup as bs def entry2html(**kwargs): """ Format feedparser entry """ title = kwargs['title'].encode('utf-8') link = kwargs['link'].encode('utf-8') description = kwargs['description'].encode('utf-8') template = """ <h2 class='title'>{title}</h2> <a class='link' href='{link}'>{title}</a> <span class='description'>{description}</span> """ return template.format(title=title, link=link, description=description) def convert_feed(**kwargs): """ Main loop """ out = StringIO.StringIO("") for entry in parsefeed(kwargs['url']).entries: title = entry['title'] link = entry['link'] description = entry['description'] print >> out, entry2html(title=title, link=link, description=description) return bs(out.getvalue(), 'lxml').prettify() def save_file(url, fname): ''' Save data to disc''' with open(fname, 'w') as file_object: file_object.write(convert_feed(url=url).encode('utf-8')) print save_file('http://stackoverflow.com/feeds', 'index.html') 

PS. Если я удалю любой из них, скрипт сломается.

Я попытался поставить # -*- coding: utf-8 -*- в верхней части файла, но это не исправить. Я получил эту ошибку.

 C:\Python27>python rss2html.py File "rss2html.py", line 40 save_file('http://stackoverflow.com/feeds', 'index.html') ^ SyntaxError: invalid syntax C:\Python27>python rss2html.py Traceback (most recent call last): File "rss2html.py", line 40, in <module> save_file('http://stackoverflow.com/feeds', 'index.html') File "rss2html.py", line 38, in save_file file_object.write(convert_feed(url=url)) File "rss2html.py", line 32, in convert_feed print >> out, entry2html(title=title, link=link, description=description) File "rss2html.py", line 22, in entry2html return template.format(title=title, link=link, description=description) UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 172: ordinal not in range(128) 

3 Solutions collect form web for “Мой скрипт очень часто использует .encode ('utf-8'). Я чувствую, что я что-то делаю неправильно”

Ваши kwargs являются строками unicode. Вы также должны определить свой шаблон как строку юникода, используя префикс u , а затем кодировать один раз в конце.

 template = u""" <h2 class='title'>{title}</h2> <a class='link' href='{link}'>{title}</a> <span class='description'>{description}</span> """ return template.format(title=title, link=link, description=description).encode('utf-8') 

Ну, я понял, дайте мне знать, что вы, ребята, думаете. Является ли этот метод лучше, чем все эти .encode ('utf-8') вызовы или это взлом, и их все еще более питонический способ устранения .encode('utf-8') .

Вот новый скрипт

 # -*- coding: utf-8 -*- """ Simple rss to html converter """ __version__ = "0.0.1" __author__ = "Ricky L Wilson" import StringIO from feedparser import parse as parsefeed from bs4 import BeautifulSoup as bs def flatten_unicode_keys(d): '''pass unicode keywords to **kwargs ''' for k in d: if isinstance(k, unicode): v = d[k] del d[k] d[str(k)] = v def entry2html(**kwargs): """ Format feedparser entry """ flatten_unicode_keys(kwargs) title = kwargs['title'] link = kwargs['link'] description = kwargs['description'] template = """ <h2 class='title'>{title}</h2> <a class='link' href='{link}'>{title}</a> <span class='description'>{description}</span> """ return template.format(title=title, link=link, description=description) def convert_feed(**kwargs): """ Main loop """ out = StringIO.StringIO("") for entry in parsefeed(kwargs['url']).entries: title = entry['title'] link = entry['link'] description = entry['description'] print >> out, entry2html(title=title, link=link, description=description) return bs(out.getvalue(), 'lxml').prettify() def save_file(url, fname): ''' Save data to disc''' with open(fname, 'w') as file_object: file_object.write(convert_feed(url=url)) save_file('http://stackoverflow.com/feeds', 'index.html') 

Итак, вот новейшая версия сценария не более flatten_unicode_keys(d) больше не StringIO и не больше for loops Я думаю, что это более пуфоническое, чем предыдущие версии. Его также быстрее.

 # -*- coding: utf-8 -*- """Simple RSS to HTML converter.""" __version__ = "0.0.2" __author__ = "Ricky L Wilson" from bs4 import BeautifulSoup from feedparser import parse as parse_feed TEMPLATE = u""" <h2 class='title'>{title}</h2> <a class='link' href='{link}'>{title}</a> <span class='description'>{summary}</span> """ def entry_to_html(**kwargs): """Formats feedparser entry.""" return TEMPLATE.format(**kwargs).encode('utf-8') def convert_feed(url): """Main loop.""" html_fragments = [entry_to_html(**entry) for entry in parse_feed(url).entries] return BeautifulSoup("\n".join(html_fragments), 'lxml').prettify() def save_file(url, filename): """Saves data to disc.""" with open(filename, 'w') as file_object: file_object.write(convert_feed(url).encode('utf-8')) if __name__ == '__main__': save_file('http://stackoverflow.com/feeds', 'index.html') with open('index.html') as fobj: print fobj.read() 
Python - лучший язык программирования в мире.