使用Java

时间:2015-05-19 15:00:06

标签: java html extract

我从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个孩子,这需要很长时间。

我很乐意对我所做的事情提出任何建议或意见,以便我可以改进这一点并使其具有可扩展性,并可能找到一种智能的方法来解决我的任务。

1 个答案:

答案 0 :(得分:0)

假设<span class="user">user_name</span>仅在用户在聊天中说出某事之前发生,您可以:

  • 创建一个Map,键是用户名,值是用户说出的次数。
  • 选择所有用户条目doc.select("span[class=user]")
    • 为每个条目获取具有该用户名的地图条目
    • 如果条目存在,则将值递增1,否则创建条目并将值初始化为一个

这种方法的优点是您不必计算子项并计算整个XML文件。