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>"

Ничего общего с сценарием или самим сервером.

Другие вопросы по тегам