我通过用空字符串替换https://
,#
,@
之前的任何字词来收集推文并过滤每条推文。我有一个过滤功能就是这样:
def filter(line):
pattern = r"(https?://|[@#])\S*"
s = re.sub(pattern, '', line)
return s
当我尝试运行它时,Python会返回此错误:
File "C:\Users\John\Desktop\Sia_prefExer02.py", line 36, in <module>
filteredLine = filter(line)
File "C:\Users\John\Desktop\Sia_prefExer02.py", line 25, in filter
s = re.sub(pattern, '', line)
File "C:\Users\John\AppData\Local\Programs\Python\Python36-32\lib\re.py", line 191, in sub
return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object
第36行是:
filteredLine = filter(line)
第25行是:
s = re.sub(pattern, '', line)
这里似乎有什么问题? 这与API有关吗?我使用的是Tweepy。
答案 0 :(得分:0)
我会假设您在每条推文上运行tweet.text
方法。
但是根据Tweepy docs“Hello Tweepy”示例,您应该在import tweepy
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
public_tweets = api.home_timeline()
for tweet in public_tweets:
print tweet.text
上运行它:
Status
如果查看API Reference,您会发现大多数方法返回filteredLine = filter_tweet(line)
个对象。 (这无疑是难以阅读的代码!)
您可以将函数包装起来,并将第36行替换为def filter_tweet(status):
return filter(status.text)
tweet_status
旁注:如果是这种情况,我会将您的行变量重命名为Status
或其他某些内容,以便您可以更好地猜测它是{{1}}对象,而不是字符串。
如果这不起作用,请粘贴您的代码,以便我们能够正确诊断问题。因为我真的很想出去。