2016-02-23 139 views
0

我一直在使用Jsoup進行HTML解析,但是我遇到了一個很大的問題。它需要1小時太長時間。Html在Java中使用Jsoup解析

這是我正在解析的網站。

<tr> 
    <td class="class1">value1 </td> 
    <td class="class1">value2</td> 
    <td class="class1">value3</td> 
    <td class="class1">value4</td> 
    <td class="class1">value5 </td> 
    <td class="class1">value6</td> 
    <td class="class1">value7</td> 
    <td class="class1">value8</td> 
    <td class="class1">value9</td> 
</tr> 

在現場,有成千上萬這樣的表,我需要將它們全部解析到一個列表。我只需要value1和value6,所以要使用這個代碼。

Document doc = Jsoup.connect(url).get(); 
      ls = new LinkedList(); 
      for(int i = 15; i<doc.text().length(); i++) {//15 because the tables I want starting from 15 
       Element element = doc.getElementsByTag("tr").get(i);//table index 
       Elements row = element.getElementsByTag("td"); 
       value6 = row.get(5).text();//getting value6 
       value1 = row.get(0).text();//getting value1 
       node = new Node(value1, value6); 
       ls.insert(node); 

正如我所說,它需要太多的時間,所以我需要做得更快。任何想法如何解決這個問題?

+0

解析單個文件需要一個小時?你分析多少個文件?他們多大?在開始之前他們都在當地嗎?還是你同時爬行一個網站?似乎不太可能在現代硬件上運行單個URL的代碼需要一個小時。 –

+0

你能否包含任何你錯過的東西,比如ls,value1和value6變量。也許從那裏我可以幫助更多。 –

+0

正如我所說,網站上有數百個表格,我只是在解析表格。不,我不爬行,是的,它只有一個包含表格的url。這些值只是一個文本,沒什麼。例如,value1是一個像Michael這樣的名稱,value6只是一個門號碼5。 –

回答

2

我認爲你的問題源於for循環for(int i = 15; i<doc.text().length(); i++)。你在這裏做的是循環遍歷整個文檔的字符。我非常懷疑這是你想要做的。我想你想循環使用表格行。所以,這樣的事情應該工作:

Document doc = Jsoup.connect(url).get(); 
Elements trs = doc.select("tr"); 
for (int i = 15; i < trs.size(); i++){ 
    Element tr = trs.get(i); 
    Elements tds = tr.select("td").; 
    String value6 = tds.get(5).text(); //getting value6 
    String value1 = tds.get(1).text(); //getting value1 
    //do whatever you need to do with the values 
} 
+0

感謝您的評論。是的,它做我需要的,但速度是一樣的。 –

+0

你能提供你正在解析的網址嗎?那裏有多少桌子和幾排?它可能非常龐大,您的計算機開始交換? – luksch

+0

由於安全原因,我無法提供網址。但約有。那裏有1400張桌子。 –