Я довольно noob и использую какой-то заимствованный код на Python для очень простого анализа JSON твитов, которые я потянул с tweepy. Я пытался решить себя, но, похоже, создает больше проблем.Очистить исправление для KeyError NoneType при разборе JSON
Просто несколько строк в файле .txt вызывают проблемы. С одной стороны, этот файл содержит это периодически:
{"limit":{"track":3,"timestamp_ms":"1487481419833"}}
С другой стороны, для некоторых твитов поля Чирикать все есть, но, кажется, не быть в формате JSON (например, Sublime не распознает синтаксис например).
В результате приведенный ниже код дает мне KeyError «текст»
tweets['text'] = map(lambda tweet: tweet['text'], tweets_data)
Так что я исправить, изменив его:
tweets['text'] = map(lambda tweet: tweet.get('text', None), tweets_data)
Однако, теперь я получаю другую ошибку позже мой код при использовании:
def word_in_text(word, text):
word = word.lower()
text = text.lower()
match = re.search(word, text)
if match:
return True
return False
Я получаю ошибку:
AttributeError: 'NoneType' object has no attribute 'lower'
Я полагаю, что должно быть более чистое, более простое решение для всего этого. Какие-либо предложения? Ниже приведен полный код (минус несколько графиков, которые я печатаю, и несколько столбцов, которые я создал в dataFrame).
Большое спасибо и извини, если у меня нет надлежащего этикета.
import json
import pandas as pd
import matplotlib.pyplot as plt
import re
tweets_data_path = '[...trump_tweets.txt]'
tweets_data = []
tweets_file = open(tweets_data_path, "r")
for line in tweets_file:
try:
tweet = json.loads(line)
tweets_data.append(tweet)
except:
continue
print "Number of tweets included is " + str(len(tweets_data))
tweets = pd.DataFrame()
tweets['text'] = map(lambda tweet: tweet.get('text', None), tweets_data)
tweets['lang'] = map(lambda tweet: tweet.get('lang', None), tweets_data)
tweets['country'] = map(lambda tweet: tweet.get('place', None), tweets_data)
def word_in_text(word, text):
word = word.lower()
text = text.lower()
match = re.search(word, text)
if match:
return True
return False
search_term_1 = 'America'
search_term_2 = 'POTUS'
search_term_3 = 'ban'
tweets[search_term_1] = tweets['text'].apply(lambda tweet: word_in_text(search_term_1, tweet))
tweets[search_term_2] = tweets['text'].apply(lambda tweet: word_in_text(search_term_2, tweet))
tweets[search_term_3] = tweets['text'].apply(lambda tweet: word_in_text(search_term_3, tweet))
print "tweets mentioning search_term_1: " + str(tweets[search_term_1].value_counts()[True])
print "tweets mentioning search_term_2: " + str(tweets[search_term_2].value_counts()[True])
print "tweets mentioning search_term_3: " + str(tweets[search_term_3].value_counts()[True])
Возможно, у одного из твитов нет текста? вы пытались напечатать твиты и посмотреть на мятежный? –
@omri_saadon Да, я вижу проблему на самом деле - вот что я пытался объяснить наверху. В файле .txt есть временная отметка «limit», а другие твиты не отображаются в правильном синтаксисе (для тех, кого я предполагаю, что поле отсутствует или что-то еще). – Kees
В этом случае, я думаю, вы получаете rateLimitException, это правда? Что вы хотите достичь? во избежание ошибки или не перебора неправильных твитов? –