UnicodeEncodeError: 'ascii' codec can T encode character u'\xea' in position 39: ordinal not in range(128)
Ich bin neu in Python und ich habe versucht, es zu beheben für zwei Stunden jetzt.
Hier der code:
import praw
import json
import requests
import tweepy
import time
access_token = 'REDACTED'
access_token_secret = 'REDACTED'
consumer_key = 'REDACTED'
consumer_secret = 'REDACTED'
def strip_title(title):
if len(title) < 94:
return title
else:
return title[:93] + "..."
def tweet_creator(subreddit_info):
post_dict = {}
post_ids = []
print "[bot] Getting posts from Reddit"
for submission in subreddit_info.get_hot(limit=20):
post_dict[strip_title(submission.title)] = submission.url
post_ids.append(submission.id)
print "[bot] Generating short link using goo.gl"
mini_post_dict = {}
for post in post_dict:
post_title = post
post_link = post_dict[post]
short_link = shorten(post_link)
mini_post_dict[post_title] = short_link
return mini_post_dict, post_ids
def setup_connection_reddit(subreddit):
print "[bot] setting up connection with Reddit"
r = praw.Reddit('yasoob_python reddit twitter bot '
'monitoring %s' %(subreddit))
subreddit = r.get_subreddit(subreddit)
return subreddit
def shorten(url):
headers = {'content-type': 'application/json'}
payload = {"longUrl": url}
url = "https://www.googleapis.com/urlshortener/v1/url"
r = requests.post(url, data=json.dumps(payload), headers=headers)
link = json.loads(r.text)['id']
return link
def duplicate_check(id):
found = 0
with open('posted_posts.txt', 'r') as file:
for line in file:
if id in line:
found = 1
return found
def add_id_to_file(id):
with open('posted_posts.txt', 'a') as file:
file.write(str(id) + "\n")
def main():
subreddit = setup_connection_reddit(‘python’)
post_dict, post_ids = tweet_creator(subreddit)
tweeter(post_dict, post_ids)
def tweeter(post_dict, post_ids):
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
for post, post_id in zip(post_dict, post_ids):
found = duplicate_check(post_id)
if found == 0:
print "[bot] Posting this link on twitter"
print post+" "+post_dict[post]+" #python"
api.update_status(post+" "+post_dict[post]+" #python")
add_id_to_file(post_id)
time.sleep(30)
else:
print "[bot] Already posted"
if __name__ == '__main__':
main()
Traceback:
root@li732-134:~# python twitter.py
[bot] setting up connection with Reddit
[bot] Getting posts from Reddit
[bot] Generating short link using goo.gl
[bot] Already posted
[bot] Already posted
[bot] Already posted
[bot] Posting this link on twitter
Traceback (most recent call last):
File "twitter.py", line 82, in <module>
main()
File "twitter.py", line 64, in main
tweeter(post_dict, post_ids)
File "twitter.py", line 74, in tweeter
print post+" "+post_dict[post]+" #python"
UnicodeEncodeError: 'ascii' codec can't encode character u'\xea' in position 39:
ordinal not in range(128)`
Ich habe wirklich keine Ahnung, was zu tun ist. Könnte mir jemand zeigen in die richtige Richtung?
Edit: code Hinzugefügt und traceback.
Nach dem code hier, dann geben Sie uns die vollständigen traceback-Fehler.
Getan, es ist jetzt da.
Getan, es ist jetzt da.
InformationsquelleAutor | 2014-11-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sogar, wenn Sie anrufen
decode()
sind die bytes, die Sie erhalten haben, um in einem erwarteten, codierter form.Wenn
\xea
begegnet, die in einer UTF-8-string, es muss werden, gefolgt von zwei bytes, und nicht einfach nur ein Byte, werden Sie in den gültigen Bereich. Sonst ist es nicht gültig UTF-8.E. g. hier sind zwei Unicode-code-points. Der erste code, der Punkt
U+56
dauert nur ein einzelnes byte. Die nächsteU+a000
erfordert drei bytes, und die Art, wie wir wissen, ist, weil wir die Begegnung\xea
:http://hexutf8.com/?q=0x560xea0x800x80
Einfach entfernen das Letzte von der Fortsetzung bytes in den oben genannten, und diese ist nicht mehr gültig UTF-8:
http://hexutf8.com/?q=0x560xea0x80
Ich nicht sehen, wo du gepostet hast der Wert, die Sie Versagen, aber ich würde überprüfen, und stellen Sie sicher, Sie sind eigentlich immer gültige UTF-8-Daten.
InformationsquelleAutor jar
Den Fehler hier passiert:
Das problem scheint zu sein, dass Sie die Verkettung von ASCII-strings und Unicode-strings in dieser Zeile. Das ist ein problem verursacht hier. Versuchen Sie die Verkettung nur Unicode-strings:
Wenn Sie immer noch Probleme haben, schauen Sie sich die Ausgabe von
type(post)
undtype(post_dict[post])
die sowohl Unicode-Zeichenfolgen. Wenn nicht, dann müssen Sie wandeln Sie in eine Unicode-Zeichenfolge mithilfe der richtigen Codierung (meist UTF-8). Das kann wie folgt erledigt werden:oder:
Das würde nicht konvertieren einen string in einen Unicode-string in Python 2. Sobald Sie das getan haben, können Sie sicher verketten Sie die Unicode-Zeichenfolgen zusammen. Das wichtigste in Python 2 ist, mischen Sie nie regelmäßig Zeichenketten mit Unicode-strings als dass Sie Probleme verursachen.
print post + u" " + post_dict[post].decode('UTF-8') + u" #test"
aber ich bin immer der gleiche Fehler. Ich habe auch versuchtprint post+" "+post_dict[post].decode('UTF-8')+" #test"
Sie werden wahrscheinlich brauchen, um zu decodieren, die beide, so
post
als gut. Ansonsten hast du noch die Verkettung von ASCII-string mit andere Unicode-Zeichenfolgen.post.decode('UTF-8')+" "+post_dict[post].decode('UTF-8')+" #test" erzeugt den Fehler
File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xea' in position 39: ordinal not in range(128)
haben Sie Links aus der
u
vor die Saiten dazwischen, so dass diejenigen, die jetzt noch ASCII-strings. Alle Variablen müssen einen.decode
nennen, und alle anderen Saiten müssenu
vor. Wenn Sie noch Fehler erhalten, nachdem Sie das getan haben, dann werden die Variablen nicht enthalten UTF-8 - (aber deine Fehlermeldung sollte nicht mehr erwähnen, ASCII).print post.decode('UTF-8') + u" " + post_dict[post].decode('UTF-8') + u" #python"
produziert, die genau die gleiche Fehlermeldung wie vorher.InformationsquelleAutor Simeon Visser