2015-05-19 61 views
0

我從Facebook上下載了我的個人數據,並認爲我可以用它做一些有趣的事情。我正在嘗試提取我擁有的特定羣聊。用Java提取html代碼

我使用的文件大小爲18 kB,因此標籤內部有很多html代碼,沒有任何標識或任何有助於提取數據的內容。我所有的聊天之間唯一的區別是它涉及到不同的人,所以這就是我開始檢查的內容。

我正在使用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

假設的<span class="user">user_name</span>只有一個用戶說,一些在聊天,你可能之前發生:

  • 創建地圖,關鍵是用戶名和存在的次數值的用戶說了些什麼。
  • 選擇每個條目中的所有用戶條目doc.select("span[class=user]")
    • 獲得具有該用戶名
    • 如果條目存在的映射項,由一個增加值,否則創建的條目和值初始化爲一個

這種方法的優點是您不必計數孩子並瀏覽整個XML文件。

+0

感謝您的回答!我會盡力嘗試這個。 –