CGI-скрипт Python, возвращающий противоречивые результаты
Итак, у меня на сервере Apache работает скрипт Python CGI. По сути, с веб-страницы пользователь вводит слово в форму, и это слово передается в сценарий. Затем слово используется для запроса API поиска в Твиттере и возврата всех твитов для этого слова. Итак, проблема в том, что я выполняю этот запрос в цикле, поэтому я возвращаю три страницы результатов (примерно 300 твитов). Но то, что я называю сценарием (который выводит все твиты на страницу HTML), на странице иногда будет отображаться 5 твитов, иногда 18, совершенно случайных чисел. Это проблема тайм-аута, или я пропустил некоторые базовые в моем коде? Скрипт Python CGI выложен ниже, заранее спасибо.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
import urllib
import json
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
topic = form.getvalue('topic')
results=[]
for x in range(1,3):
response = urllib.urlopen("http://search.twitter.com/search.json?q="+topic+"&rpp=100&include_entities=true&result_type=mixed&lang=en&page="+str(x))
pyresponse= json.load(response)
results= results + pyresponse["results"]
print "Content-type:text/html\r\n\r\n"
print "<!DOCTYPE html>"
print "<html>"
print "<html lang=\"en\">"
print "<head>"
print "<meta charset=\"utf-8\" />"
print "<meta name=\"description\" content=\"\"/>"
print "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>"
print "<title>Data analysis for %s </title>" %(topic)
print "</head>"
print "<body>"
print "<label>"
for i in range(len(results)):
print str(i)+": "+results[i]["text"]+ "<br></br>"
print "</label>"
print "</body>"
print "</html>"
2 ответа
Прежде всего, я бы отметил, что range(1,3)
не получит три страницы, как вы ожидаете.
Однако при запуске кода Python в интерпретаторе на этом этапе возникла исключительная ситуация:
>>> for i in range(len(results)):
... print str(i) + ": "+ results[x]["text"]
<a few results print successfully>
UnicodeEncodeError: 'latin-1' codec can't encode character u'\U0001f611'
in position 121: ordinal not in range(256)
После изменения кодировки выведите их все:
>>> for i in range(len(results)):
... print str(i) + ": "+ results[i]["text"].encode('utf-8')
<success>
Хорошо понял. Это было действительно глупое исправление. По сути, так как Python анализирует JSON, ему необходимо кодировать весь текст в формат UTF-8, чтобы он мог отображаться правильно.
print str(i)+": "+results[i]["text"].encode('utf-8')+ "<br></br>"
Ничего общего с сценарием или самим сервером.