我从Facebook下载了我的个人数据,并认为我可以用它做一些有趣的事情。我正在尝试提取我所拥有的特定群聊。
我正在使用的文件大小为18 kB,因此在标签内部有很多html代码,没有任何id或任何有助于提取数据的内容。我所有聊天之间的唯一区别是它涉及的是不同的人,这就是我开始检查的内容。
我正在使用Jsoup(http://jsoup.org/)来执行此操作。文档的层次结构如下所示:
<div class="thread">
<div class="message">
<div class="message_header">
<span class="user">user_name</span>
<span class="meta"> date_when_said </span>
</div>
</div>
<p>user_said_something</p>
</div> //div class thread ends
<div class="thread"> //new group chat begins
我开始只是计算聊天中每个人说了几句话的次数。
for(int i = 0; i < doc.select("div[class=thread]").size(); i++){
if (doc.select("div[class=thread]").get(i).ownText().equals(chat_name)) {
int children = doc.select("div[class=thread]").get(i).children()
.size();
int traverse = 0;
while (traverse <= children) {
switch (doc.select("span[class=user]").get(traverse).ownText()) {
case user_one:
wordSaid[0] += 1;
break;
case user_two:
wordSaid[1] += 1;
break;
}
}
}
我在这里做的是我首先通过for-loop完成所有不同的聊天。然后我检查该线程的文本是否等于我想要提取的聊天。 如果是,那么我开始在该线程的所有子节点中迭代。
由于一个线程的孩子可以包含多达2000个孩子,这需要很长时间。
我很乐意对我所做的事情提出任何建议或意见,以便我可以改进这一点并使其具有可扩展性,并可能找到一种智能的方法来解决我的任务。
答案 0 :(得分:0)
假设<span class="user">user_name</span>
仅在用户在聊天中说出某事之前发生,您可以:
doc.select("span[class=user]")
这种方法的优点是您不必计算子项并计算整个XML文件。