Gå til innhold

Script som fungerer, men ikke når det pipes: unicode-error(løst)


Anbefalte innlegg

Hei og hå! Prøver å få en liten sak til å dumpe en rss-feed. Og det fungerer egentlig helt fint. Output:

Klikk for å se/fjerne innholdet nedenfor

[peter@aasen scripts]$ ./uiorss.py http://www.uio.no/studier/emner/matnat/ifi/INF1001/h08/beskjeder.xml?vrtx=rss
INF1000 - høst 2008
	Beskjeder fra INF1000 - høst 2008
========================
	20/8 - 2008 
Nå er <a href="http://www.uio.no/studier/emner/matnat/ifi/INF1000/h08/obliger/">Oblig1</a> lagt ut.
========================
	11/8 - 2008 
Til alle gruppelærere (ikke studentene) - møte for fordeling av grupper tirsdag 19. aug. kl. 09.15 i Lille Aud. Alle gruppelærere må møte !
========================

 

Men dersom jeg prøver å pipe det gjennom html2text(eller hva som helt annet), da kjefter python på meg.

Klikk for å se/fjerne innholdet nedenfor

[peter@aasen scripts]$ ./uiorss.py http://www.uio.no/studier/emner/matnat/ifi/INF1000/h08/beskjeder.xml?vrtx=rss | html2text
Traceback (most recent call last):
 File "./uiorss.py", line 33, in <module>
main()
 File "./uiorss.py", line 21, in main
print title
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 11: ordinal not in range(128)

 

Har prøvd å endre linjen til "print unicode(title, "utf-8")", men uten hjelp:

Klikk for å se/fjerne innholdet nedenfor
[peter@aasen scripts]$ ./uiorss.py http://www.uio.no/studier/emner/matnat/ifi/INF1000/h08/beskjeder.xml?vrtx=rss | html2text
Traceback (most recent call last):
 File "./uiorss.py", line 33, in <module>
main()
 File "./uiorss.py", line 21, in main
print unicode(title, "utf-8")
TypeError: decoding Unicode is not supported

 

Noen som har en ide om hva som er gærent? Synes det er rart at den fungerer helt fint til vanlig, men når jeg prøver å pipe den så fungerer det ikke. Dersom jeg copy-paster outputen fra når den kjøres uten pipe for så å kjøre det gjennom html2text fungerer det helt fint.

 

Her er koden dersom noen vil se:

Klikk for å se/fjerne innholdet nedenfor
#!/usr/bin/python
# -*- coding: utf-8 -*-

import feedparser
import commands
import sys

def get_feed(url):
d = feedparser.parse(url)
title = d["feed"]["title"]
subtitle = d.feed.subtitle
return title, subtitle, d["entries"]

def parse_time(time):
return str(time[2]) + "/" + str(time[1]) + " - " + str(time[0])

def main():
url = sys.argv[1]
title, subtitle, entries = get_feed(url)

print unicode(title, "utf-8")
print "\t", subtitle
print "========================"
for entry in entries:
	print "\t", parse_time(entry["updated_parsed"]),
	print entry["summary_detail"]["value"]
	print "========================"

if __name__ == "__main__":
if len(sys.argv) < 2:
	print "error: syntax: %s [options] rss-url" % sys.argv[0]
	sys.exit(1)
main()

 

EDIT: etter en del leting virker det som jeg har funnet feilkilden:

Klikk for å se/fjerne innholdet nedenfor

[peter@aasen ~]$ cat test.py 
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
print sys.stdout.encoding

print u"Hei på deg"
[peter@aasen ~]$ ./test.py 
UTF-8
Hei på deg
[peter@aasen ~]$ ./test.py | html2text 
Traceback (most recent call last):
 File "./test.py", line 7, in <module>
print u"Hei på deg"
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 5: ordinal not in range(128)
None <-- LOOK HERE!
[peter@aasen ~]$

 

Men jeg har enda ikke funnet ut hvordan jeg endrer det, så har ikke løst det helt enda.

 

EDIT2: Løsningen:

 

  import sys, codecs
 if sys.stdout.encoding is None:
sys.stdout = codecs.open("/dev/stdout", "w", 'utf-8')

Endret av Blackslash
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...