2015-08-01 6 views
1

У меня есть структура таблицы html с некоторыми данными в основной таблице, а некоторые - в вложенной таблице внутри элемента td.Как извлечь данные из таблицы html и ее внутренней таблицы?

Мне просто нужны необходимые данные (с указанием ** xx **), поэтому я могу экспортировать его в Excel как одну строку.

<table cellpadding="2" cellspacing="0" width="100%" class="chart"> 
       <tr> 
       <td>**Text 1**</td>   
       <td> 
        <table cellpadding="2" cellspacing="0"> 
        <tr> 
         <td>some useless data</td> 
         <td>**Text 2**</td> 
        </tr> 
        </table> 
       </td> 
       <td>**Text 3**</td> 
       <td>**Text 4**</td> 
       <td>**Text 5**</td> 
       </tr> 
</table> 

Мой код выглядит так:

for (Element row : excel.select("tr")) { 
     // create row for each tag 
     header = sheet.createRow(rowCount); 
     // loop through all th tag 
     Elements ths = row.select("th"); 
     int count = 0; 
     for (Element element : ths) { 
      // set header style 
      cell = header.createCell(count); 
      cell.setCellValue(element.text()); 
      cell.setCellStyle(headerStyle); 
      count++; 
     } 
     // now loop through all td tag 
     Elements tds = row.select("td"); 
     count = 0; 
     for (Element element : tds) { 
      if(!element.text().isEmpty()){ 
       cell = header.createCell(count); 
       cell.setCellValue(element.text()); 
       count++; 
       } 
     } 

Проблема здесь состоит в том, что выход не был, как и ожидалось.

Похоже, это в Excel:

Row1: Text 1 | Text 2 | useless data | Text 2 | Text 3 | Text 4 | Text 5 | 
    Row2: useless data | Text 2 | 

Дополнительная информация: теги опущены для упрощения вопроса.

То, что я хочу

Row1: Text 1 | Text 2 | Text 3 | Text 4 | Text 5 | 
+0

Это немного неясно. Что это за вторая строка в вашем выходе? Кроме того, youo пропустил строки TH из предоставленного вами html. Я думаю, что '' '' '' 'элемент, содержащий внутреннюю таблицу, возвращает с чем-то непустым, если вы вызываете его метод td.text(), поэтому есть третий выходной столбец. – luksch

+0

Еще не решил? – luksch

ответ

1

1. Два ряда

Я думаю excel это документ или таблицу. В любом случае, когда вы выбираете excel.select("tr"), вы также забираете внутренний стол tr. Чтобы этого избежать, вам нужно сделать селектор css более конкретным. Если я предполагаю excel быть документ, я могу сделать это

Elements outerTrs = excel.select("table.chart>tbody>tr"); 

в контексте вашего кода:

for (Element row : excel.select("table.chart>tbody>tr")) { 

Объяснение: Jsoup создает tbody элемент внутри таблицы, если его нет , С помощью селектора я убедился, что выбран только прямой дочерний элемент tr. Элементы внешней таблицы выбраны. Я могу это сделать, потому что я знаю имя класса внешней таблицы и кажется уникальным.

2. Неожиданное число столбцов

Это связано с тем, что ваш выбор row.select("td") заявление улавливает td, содержащий внутреннюю таблицу. если вы хотите только ТДС без дочерних элементов, которые вы могли бы использовать это:

Elements tds = row.select("td"); 
count = 0; 
for (Element element : tds) { 
if(!element.text().isEmpty() && element.children().isEmpty()){ 
    count++; 
    System.out.println("line "+count+" text = '"+element.text()+"'"); 
} 

3. бесполезные данные

Чтобы избавиться от этого, вам нужно просто отфильтровать его. Из вашего примера неясно, когда присутствуют бесполезные данные. Всегда ли это первый td во внутреннем столе? Если это так, вы можете это сделать (полное решение)

Document excel = Jsoup.parse(tab); 

for (Element row : excel.select("table.chart>tbody>tr")) { 
    Elements tds = row.select("td"); 
    int count = 0; 

    Element junkTd = row.select("td table td").first(); 

    for (Element element : tds) { 
     if(!element.text().isEmpty() 
       && element.children().isEmpty() 
       && !element.equals(junkTd)){ 

      count++; 
      System.out.println("line "+count+" text = '"+element.text()+"'"); 
     } 
    } 
} 
+0

** 1 ** Теперь все данные ушли ** 2 ** Это было вызвано ** бесполезными данными ** Теперь оно становится 'Row1: Text 1 | бесполезные данные | Текст 2 | Текст 3 | Текст 4 | Текст 5 | ' ' Row2: бесполезные данные | Текст 2 | ' – Runescapenoob

+0

Извините, не понимаю. В чем проблема сейчас? Возможно, вы хотите создать новый вопрос или добавить соответствующую информацию к этому (но не изменяйте значение исходного вопроса). Держите его коротким, но достаточно, чтобы понять, что вы делаете, что получаете и чего хотите. – luksch

+0

Первый метод возвращает мне пустой набор данных. Таким образом, я продолжал использовать исходные коды для этой части. Второй предложенный метод едва ли может выполнять эту работу как бесполезные данные, которые все еще захватываются. – Runescapenoob

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