如何从 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('')
您好,我在搜索推文中的特定文本时遇到问题。我目前正在使用 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('')