class Conversation: def __init__(self, path, interval="month"): with open(path, 'r') as f: self.__soup = BeautifulSoup(f.read(), "html.parser") self.messages = [] self.name = self.__soup.find("title").text.replace( "Conversation with ", "") message_headers = self.__soup.find_all("div", class_="message_header") self.__span_meta = [ m.find("span", class_="meta").text for m in message_headers ] self.__fbt = FbTime(self.__span_meta) for m in self.__soup.find_all("div", class_="message"): span = m.find("span", class_="meta") self.messages.append( Message( m.find("span", class_="user").text, self.__fbt.span_meta_to_date(span.text, interval), span.text, m.next_sibling.text)) self.__sent = Sentiment(self.messages, self.__fbt) self.participants = self.__scrape_participants() def interaction_freq(self): times = self.__fbt.generate_time_dict() for date_str in self.__span_meta: time = date_str.split("at ")[1][:5] hour = time.split(":")[0] times[hour + ":00"] += 1 return times def interaction_timeline(self, name): dates = self.__fbt.generate_date_dict() for message in self.messages: if message.name == name: dates[message.date] += 1 return dates def sentiment_timeline(self, name): return self.__sent.sentiment_timeline(name) def avg_sentiment(self, name): return self.__sent.avg_sentiment(name) def __scrape_participants(self): users = [] for user_span in self.__soup.find_all("span", "user"): user_name = user_span.text if user_name not in users: users.append(user_name) return users
class Conversation: def __init__(self, path, interval="month"): with open(path, 'r') as f: self.__soup = BeautifulSoup(f.read(), "html.parser") self.messages = [] self.name = self.__soup.find("title").text.replace( "Conversation with ", "") message_headers = self.__soup.find_all("div", class_="message_header") self.__span_meta = [ m.find("span", class_="meta").text for m in message_headers ] self.__fbt = FbTime(self.__span_meta) for m in self.__soup.find_all("div", class_="message"): span = m.find("span", class_="meta") self.messages.append( Message( m.find("span", class_="user").text, self.__fbt.span_meta_to_date(span.text, interval), span.text, m.next_sibling.text)) self.__sent = Sentiment(self.messages, self.__fbt) self.participants = self.__scrape_participants() def interaction_freq(self): return self.__fbt.interaction_freq() def interaction_timeline(self, name): return self.__fbt.interaction_timeline(name, self.messages) def sentiment_timeline(self, name, interval): return self.__sent.sentiment_timeline(name, interval) def avg_sentiment(self, name): return self.__sent.avg_sentiment(name) def get24HourTime(self, elem): return self.__fbt.get24HourTime(elem) # Returns a list of participants in the conversation. def __scrape_participants(self): users = [] for user_span in self.__soup.find_all("span", "user"): user_name = user_span.text if user_name not in users: users.append(user_name) return users