如何从 python 中的数组中检查特定关键字的推文文本

How to check the text of a tweet for a specific keyword from an array in python

您好,我在搜索推文中的特定文本时遇到问题。我目前正在使用 tweepy 基于一组关键字(称为 filterKeywords)来流式传输推文,但是我希望根据推文被过滤的关键字来完成特定的功能。

我将推文加载到 JSON 变量中,并尝试使用 for 循环在我的 on_data 方法中循环遍历 filterKeywords 数组,执行 IF 语句以搜索当前元素是否在filterKeywords 数组匹配 JSON 推文的 'text' 标签内的任何文本,但它似乎没有过滤任何内容,似乎立即转到我的 if 语句中的 else 语句。下面是我的代码。任何帮助将非常感激。谢谢

import tweepy
import pymongo
import json

consumer_key = ""
consumer_secret = ""
access_key = ""
access_secret = ""

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)

filterKeywords = ['IBM', 'Microsoft', 'Facebook', 'Twitter', 'Apple',        'Google', 'Amazon', 'EBay', 'Diageo',
              'General Motors', 'General Electric', 'Telefonica', 'Rolls Royce', 'Walmart', 'HSBC', 'BP',
              'Investec', 'WWE', 'Time Warner', 'Santander Group']


class CustomStreamListener(tweepy.StreamListener):
def __init__(self, api):
    self.api = api
    super(tweepy.StreamListener, self).__init__()
    try:
        global conn
        conn = pymongo.MongoClient('localhost', 27017)
        print "Connected successfully!!!"
        global db
        db = conn.mydb
    except pymongo.errors.ConnectionFailure, e:
        print "Could not connect to MongoDB: %s" % e
        conn


def on_data(self, data):
    datajson = json.loads(data)
    for word in filterKeywords:
       if word in datajson['text']:
        collection = db[word]
        collection.insert(datajson)
        print('Tweet found filtered by ' + word)
    else:
        print('')



def on_error(self, status_code):
    return True  # Don't kill the stream

def on_timeout(self):
    return True  # Don't kill the stream


sapi = tweepy.streaming.Stream(auth, CustomStreamListener(api))

sapi.filter(track=filterKeywords)

我认为你的问题是你在过滤器关键字中包含了 "Twitter",并且它匹配几乎所有内容(不仅文本用于过滤,还包括其他一些字段)。尝试将其从过滤器关键字中删除。

def on_data(self, data):
    datajson = json.loads(data)
    if any([i for i in filterKeywords if i in datajson["text"]]):
        """Do Desired function"""
    else:
        print('if statement not working')

你的程序有一个简单的错误,即使在 if 条件生效后,它可能会在下一次迭代中进入 else

来自您的评论 如果您想避免 keyError 'test'。重写您的函数,如

def on_data(self, data):
datajson = json.loads(data)
for word in filterKeywords:
    if datajson.get('text') and word in datajson['text']:
        collection = db[word]
        collection.insert(datajson)
        print('Tweet found filtered by ' + word)
else:
    print('')