2013-07-15 3 views
0

У меня есть эта странная проблема, о которой я нахожусь на своем пути. Возможно, свежий набор глаз может решить проблему!Jsoup анализирует таблицу 3 раза?

Я использую jSoup для разбора файла HTML. Проблема заключается в том, что набор таблиц выводится в файл 3-4 раза, даже когда он записывается в новый новый файл. В первый раз он выводится как одна прямая линия по файлу .csv, но каждый раз он отформатирован точно так, как я хочу. Но я, очевидно, хочу, чтобы это было правильно в первый раз, и у меня это так, что в первый раз!

Мой код:

Document doc = new Document(file.toString()); 
    doc = Jsoup.parse(file, null); 

    Elements tables = doc.select("table"); 

    for (Element table: tables) { 
     Elements rows = table.select("tr"); 
     for (Element row: rows) { 
      Elements cells = row.getElementsByTag("td"); 
      StringBuffer values = new StringBuffer(); 
      for (Element cell: cells) { 
       String cellText = cell.text(); 
       cellText = cellText.replaceAll(",", ""); 
       cellText = cellText.replaceAll("£", ",£"); 
       cellText = cellText.replaceAll(",£", "£"); 
       System.out.println(cellText); 
       values.append(cellText + ","); 
      } 
      System.out.println(values.toString()); 
      addToFile(values + ","); 
     } 
    } 

// add new data to mySNMPResults file 
private static void addToFile(String myString) { // add newest entry to .csv 
                // file 
    try { 
     BufferedWriter out = new BufferedWriter(new FileWriter(
       "MyParsedDOMTree.csv", true)); 
     out.write(myString + "\n"); 
     out.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Это также может быть просто случай сложного HTML-файла, различные таблицы, вложенные друг в друга, но я не вижу, как это вызывает таблицы с номером данных, появляется только один раз для вывода в три раза ...

EDIT

Фрагмент HTML:

<tr bgcolor = "#EEEEEE" height = 20 > 
<td width = 15% > 
<font face="tahoma" size="1"> 
Dept '<b>Food Incl Vat</b>' 
</td> 
<td width = 10% align = 
right><font face="tahoma" size="1"> 
£688.95 
</td> 
<td width = 10% align = 
right><font face="tahoma" size="1"> 
£642.60 
</td> 
<td width = 10% align = 
right><font face="tahoma" size="1"> 
£767.95 
</td> 
<td width = 10% align = 
right><font face="tahoma" size="1"> 
£3,007.00 
</td> 
<td width = 10% align = 
right><font face="tahoma" size="1"> 
£1,525.60 
</td> 
<td width = 10% align = 
right><font face="tahoma" size="1"> 
£1,970.40 
</td> 
<td width = 10% align = 
right><font face="tahoma" size="1"> 
£353.00 
</td> 
<td width = 1%></td><td width 
= 14% align = right bgcolor = "#DFDFDF"><font face="tahoma" size="1" color = '#444444'> 
<b>£8,955.50</b></td> 
</tr> 

ответ

1

EDIT: Извините, у вас была ошибка в коде. Исправлено.

У меня действительно нет достаточного количества вашего кода, чтобы сделать правильную догадку, но я не уверен, почему вы пытаетесь получить размер таблицы, а затем переходите через эту таблицу, но много раз .size() (я думаю, 3-4). Если вы захотите найти корень таблиц, то под корнями будет имя таблицы (имя класса для таблиц должно быть одинаковым), затем выполните поиск в каждой таблице для того, что вы хотите найти. Может быть, какой-то код поможет :)

HTML:

<ul class="ListOfTables"> 
      <li class="TABLE"> 
       <span class="item"> 
      <li class="TABLE"> 
       <span class="item"> 
      <li class="TABLE"> 
       <span class="item"> 
      <li class="TABLE"> 
       <span class="item"> 

Java код:

public void searchForItems(Document doc) 
{ 
    Elements tables = doc.select("li[class=TABLE]"); 
    for (Element table : tables) 
    { 

     String item; 
     Elements itemsInTable = table.select("span[class=item]"); 
     item = itemsIntTable.text(); 


     //Write the item to file. Depending on what is in your table, you might 
     //have to write a more complex scan. Looking for things like attributes 
    } 
} 
+0

Спасибо за ответ, но я боюсь, что HTML в этом случае очень сложно по сравнению с простым один вы использовали. Я хочу распечатать каждую таблицу в файле csv. И метод size() возвращает количество таблиц на этой странице (всего 27), поэтому теоретически я должен просто пропустить и распечатать. – GreenGodot

+0

Я только заметил, что если бы я заменил размер на 5, тогда таблица распечатывается ровно один раз. Проблема в том, что я хочу, чтобы это работало с несколькими различными файлами HTML с разными размерами, поэтому я не могу использовать фиксированный номер .... – GreenGodot

+0

Вот почему вам нужно найти все таблицы, поместить их в массив Elements и затем отсканировать этот массив , Можете ли вы привести мне пример некоторых из html, чтобы я мог больше помочь вам? – Collin

Смежные вопросы