Python Twitter JSON 无法提取位置、地点或时区

标签 python json twitter tweepy

我必须对流式 Twitter 数据进行分析。

tweets_data_path = 'allnews.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

tweets = pd.DataFrame()

我正在尝试运行以下两行:

tweets['Location'] = map(lambda tweet: tweet['place']['country'] if tweet['place'] != None else None, tweets_data)
tweets['time_zone'] = map(lambda tweet: tweet['time_zone'] if 'time_zone' in tweet else ' ', tweets_data)

对于第一行,我得到:

KeyError: 'place'

这很奇怪,因为地方确实存在,尽管有时为空

对于第二行,我没有收到错误,但该列只是空的,尽管 JSON 中确实存在时区。

以下是 JSON 的摘录:

"place":null(note that there aren't quotations around null)

"time_zone":"Central Time (US & Canada)"

"location":"London"

我注意到有时位置为空,但随后有一个位置。

任何帮助将不胜感激,我开始变得绝望了! :')

编辑

另外,当我只使用 1/4 的 JSON 时,不会出现“place”错误

最佳答案

您的代码中有很多问题,最大的问题是 time_zone 不是 json 中的键,它出现在某些 json 中,但出现在嵌套字典中。这将创建 df:

import pandas as pd
import json
with open('news11pm.txt')as f:

    tweets_data = []
    for line in f:
        try:
            tweet = json.loads(line)
            tweets_data.append(tweet)
        except ValueError as e:
            print(e)
            pass


tweets = pd.DataFrame()
import numpy as np
tweets['Location'] = [tweet['place']['country']if "place" in tweet and tweet['place'] else np.nan for tweet in tweets_data ]
tweets['time_zone'] = [tweet['time_zone'] if 'time_zone' in tweet else np.nan for tweet in tweets_data]

在 df 上调用 dropna 会给我们一个空的 df!这是因为 time_zone 不作为键存在,因此所有 time_zone 列都充满了 nan:

print(tweets["Location"].dropna())

Empty DataFrame
Columns: [Location, time_zone]
Index: []

要调试问题,几个简单的步骤将有助于将其拼凑起来:

# find if there are missing keys and  where
for ind, d in enumerate(tweets_data):
    if "time_zone" not in d:
        print("No time_zone {}".format(ind))
    elif "place" not in d:
        print("No place {}".format(ind))

该循环确认 time_zone 实际上不作为键存在,并且 place 在两个字典中丢失,因此要找到 time_zone 的位置我们在每个字典的值中查找一个字典,并找到获得该字典的键。

# now we know time_zone does not exist as a key, 
# check if it is in a nested dict value
for ind, d in enumerate(tweets_data):
    for k, v in d.items():
        if isinstance(v, dict) and "time_zone" in v:
            print(k, ind, v["time_zone"])

因此,在调试之后,我们发现 time_zone 存在于一个带有 user 键的嵌套字典中,因此将它们放在一起:

import numpy as np

tweets = pd.DataFrame()
tweets['Location'] = [tweet['place']['country'] if "place" in tweet and tweet['place']
                      else np.nan for tweet in tweets_data]
tweets['time_zone'] = [tweet["user"]['time_zone'] if "user" in tweet and tweet["user"]['time_zone']
                       else np.nan for tweet in tweets_data]

现在调用 drop_na 我们得到一些更有用的东西:

                 Location                    time_zone
17         United Kingdom                       London
269         United States   Eastern Time (US & Canada)
378                México  Mountain Time (US & Canada)
409                 India                      Chennai
660        United Kingdom                Europe/London
1010               France                         Rome
1125               Polska                       Warsaw
1689        United States   Eastern Time (US & Canada)
1902        United States   Central Time (US & Canada)
1929                Kenya                      Baghdad
2248       United Kingdom                       London
2300       United Kingdom                       London
2441       United Kingdom                       Hawaii
2491               España                       Hawaii
2500       United Kingdom                    Amsterdam
2534        United States   Pacific Time (US & Canada)
....................................

关于Python Twitter JSON 无法提取位置、地点或时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445317/

相关文章:

python - 如何摆脱字典中的 None 值?

javascript - Twitter 客户端 javascript qml oauth 401 无法验证签名和 token

javascript - Twitter 小部件完全加载后调用函数

python - 类函数与方法?

python - Cobra/LDTP 导入不起作用

python - 尝试使用 python 抓取网站时出错

JSON Schema 嵌套 If Then

javascript - 将 php 关联数组转换为字符串时遇到问题

java - 如何解析数据集apache spark java中的多行json

angularjs - 如何在 Ionic 应用程序中显示 Twitter 时间线?