Как разобрать ячейки 3-го столбца таблицы? - PullRequest
1 голос
/ 23 октября 2011

Я пытаюсь разобрать ячейки 3-го столбца <table> с помощью Jsoup.

Вот HTML:

<b><table title="Avgångar:" class="tableMenuCell" cellspacing="0" cellpadding="4" border="0" id="GridViewForecasts" style="color:#333333;width:470px;border-collapse:collapse;">
    <tr class="darkblue_pane" style="color:White;font-weight:bold;">
        <th scope="col">Linje</th>
        <th scope="col">Destination</th>
        <th scope="col">Nästa tur (min)</th>
        <th scope="col">&nbsp;</th>
        <th scope="col">Därefter</th>
        <th scope="col">&nbsp;</th>
    </tr>
    <tr class="white_pane" style="color:#333333;">
        <td align="right" style="color:#000000;background-color:#01AEF0;">1</td>
        <td align="left">Hovshaga Kurortsv.</td><td align="right">55</td>
        <td align="left"></td>
        <td align="right">--</td>
        <td align="left"></td>

    </tr>
    <tr class="lightblue_pane" style="color:#284775;">
        <td align="right" style="color:#000000;background-color:#01AEF0;">1</td>
        <td align="left">Hovshaga via Resecentrum</td><td align="right">21</td>
        <td align="left"></td><td align="right">--</td>
        <td align="left"></td>
    </tr>
    <tr class="white_pane" style="color:#333333;">
        <td align="right" style="color:#000000;background-color:#01AEF0;">1</td>
        <td align="left">Teleborg</td><td align="right">5</td>
        <td align="left"></td><td align="right">45</td><td align="left"></td>
    </tr>
</table></b>

Вот моя попытка кода, которая выдает NullPointerException:

 URL url = null;
try {
    url = new URL("http://wap.nastabuss.se/its4wap/QueryForm.aspx?hpl=Teleborg+C+(V%C3%A4xj%C3%B6)");
} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
System.out.println("1");
Document doc = null;
try {
    System.out.println("2");
    doc = Jsoup.parse(url, 3000);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
System.out.println("3");
Element table = doc.select("table[title=Avgångar:]").first();
System.out.println("3");
Iterator<Element> it = table.select("td").iterator();

//we know the third td element is where we wanna start so we call .next twice
it.next();
it.next();
while(it.hasNext()){
  // do what ever you want with the td element here
System.out.println("::::::::::"+it.next());
  //iterate three times to get to the next td you want. checking after the first
  // one to make sure
  // we're not at the end of the table.
  it.next();
  if(!it.hasNext()){ 
    break;
  }
  it.next();
  it.next();
}

Идет до второго System.Out.Println("3");, а затем застревает.

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

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

Кроме того, я бы посоветовал не делать это жестким и подверженным ошибкам способом. Поскольку у <table> уже есть атрибут id, который должен быть уникальным во всем документе, просто используйте селектор идентификатора #someid. Кроме того, вы можете получить ячейки 3-го столбца, используя селектор индекса :eq(index) (примечание: он основан на нуле!).

Итак, эти несколько простых строк должны сделать это:

Document document = Jsoup.connect("http://wap.nastabuss.se/its4wap/QueryForm.aspx?hpl=Teleborg+C+(V%C3%A4xj%C3%B6)").get();
Elements nextTurns = document.select("#GridViewForecasts td:eq(2)");

for (Element nextTurn : nextTurns) {
    System.out.println(nextTurn.text());
}

что приводит здесь:

50
30
10
18
3
24

Вот и все.

Я настоятельно рекомендую потратить некоторое время на правильное изучение синтаксиса селектора CSS, поскольку Jsoup построен на его основе.

Смотри также:

0 голосов
/ 18 мая 2015

Я думаю, что лучшим решением является использование get(); метода для получения одного element из числа elements.

Document doc = Jsoup.connect("your_url").get();
Elements table = doc .getElementById("id_of_your_table");
Element tr = table.select("tr").get(2); // this will get 3rd tr
//if you need 3rd column of 3rd row then 
Element 3rdtd = tr.select("td").get(2);
Log.i("3rd Column of 3rd Row", 3rdtd.text().toString());

Надеюсь, это поможет.

...