2010-01-17 41 views
0

我正在研究一個需要從服務器上拉下並解析.html頁面然後解析它的內容的項目。我搜索了一個字符串作爲單元測試的兩個值,然後將它們保存到List中,然後將它們與手動創建的String []進行比較。代碼如下:列表數組錯誤?

SiteGrabber.java:

//some imports 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 
import javax.swing.JOptionPane; 


public class SiteGrabber { 

//constructor and java.net stuff 

public List<String> getWords(String content){ 
    int prev = 0; 
    List<String> res = new ArrayList<String>(); 
    String tar = "<tr> <td></td><td><li>"; 
    int tarlen = tar.length(); 
    while(content.indexOf(tar, prev) != -1){ 
     int contentind = content.indexOf("</li>", prev); 
     if(contentind != -1){ 
      res.add(
       content.substring(
        content.indexOf(tar, prev) + tarlen, 
        content.indexOf("</li>", content.indexOf(tar, prev)))); 
      prev = contentind + 5; 
     } 
     else{break;} 
    } 
    return res; 
} 

} 

SiteGrabberTest.java:

import java.util.List; 

import org.junit.Test; 

import junit.framework.Assert; 

public class SiteGrabberTest { 

String htsTest="<tr> <td>List of scrambled words:&nbsp;&nbsp;&nbsp;</td> <td><li>nielle</li></td> </tr><tr> <td></td><td><li>ierneb</li></td> </tr>"; 
//I want the text between the </td><td><li>...</li> tags. 
//2 working tests that show that it sets the List.size() to 0 on a dummy string 
//and that it records the right number of results in the List on a valid input. 


@Test public void ValidContentTest(){ 
    SiteGrabber myGrabber = new SiteGrabber(); 
    List<String> mylst = myGrabber.getWords(htsTest); 

    String[] expected = new String[] {"nielle", "ierneb"}; 
    Assert.assertEquals("wrong size", expected.length, mylst.size()); 
    for (int i = 0; i < expected.length; i++) { 
     Assert.assertEquals("wrong word", expected[i], mylst.get(i)); 
        //breaks on 1st iteration, saying it expects "nielle" and got 
        //">ierneb", implying some sort of off-by-one error. 
    } 


} 
} 
+1

而問題是....?請解釋你的問題是什麼。不要讓人們閱讀,編譯和運行你的代碼,只是爲了弄清楚什麼是錯的。 – duffymo 2010-01-17 04:21:13

+0

你忘了告訴錯誤本身。你知道,一個錯誤/異常詳細說明了問題的根本原因。你也知道,一旦問題的根本原因被理解,解決方案是顯而易見的:) – BalusC 2010-01-17 04:21:31

+0

對不起。問題是JUnit在第三個測試ValidContentTest()上失敗。它返回'> ierneb'而不是nielle。我會嘗試刪除一些不需要的部分,並添加JUnit錯誤消息。 – pagboy 2010-01-17 04:24:24

回答

1

變化:

content.indexOf(tar, prev) + tarlen 

到:

content.indexOf(tar, prev) + tarlen + 1 
+0

這是有道理的。我最初過度補償了tarlen-1,並且刪除了-1幫助。謝謝! – pagboy 2010-01-17 05:05:29

0

我懷疑這裏...

content.substring(
       content.indexOf(tar, prev) + tarlen, 
       content.indexOf("</li>", content.indexOf(tar, prev)))); 

你會發現你off-by-one problem ...更具體地說,

content.indexOf("</li>", content.indexOf(tar, prev)) 

... as content.indexOf(tar, prev)返回一個索引(範圍從0到n-1),並且您試圖使用它作爲長度(應該從1到n)。
聽起來正確嗎?

嘗試把在那裏「+ 1」 ...

content.indexOf("</li>", content.indexOf(tar, prev)+1) 

而且,你的技術將不會爲所有的HTML文檔。您應該使用正確的HTML解析庫/工具或實際上按元素逐個解析HTML。

+0

這對hackthissite.org來說是一個挑戰,數據是以預定義的格式存在的,但我明白你的意思是需要一個通用的解析系統。這是針對一個特定的問題,而不是一個框架。 – pagboy 2010-01-17 05:06:42