2016-03-03 4 views
0

Я создаю приложение для своей школы, чтобы было легче проверить, какой урок у вас есть. im, используя свой сайт, но у них явно нет простого API. поэтому мне нужно, чтобы прочитать сайт вниз и получить все на куски. (одиночные теги в глубинах слоев таблиц).
так это то, что я в настоящее время с помощью:
Jsoup getElementsByTag

doc.body().getElementsByTag("div").get(0).getElementsByTag("table").get(1).getElementsByTag("tbody").get(0).getElementsByTag("tr").get(1).getElementsByTag("td").get(0).getElementsByTag("table").get(0).getElementsByTag("tbody").get(0).getElementsByTag("tr").get(0).getElementsByTag("td").get(0).getElementsByTag("a").get(0).html() 

док = Jsoup проанализирован документ.
для этого кода работает все нормально, но как только я я попробовать это:

doc.body().getElementsByTag("div").get(0).getElementsByTag("table").get(1).getElementsByTag("tbody").get(0).getElementsByTag("tr").get(2).getElementsByTag("td").get(0).getElementsByTag("table").get(0).getElementsByTag("tbody").get(0).getElementsByTag("tr").get(0).getElementsByTag("td").get(0).getElementsByTag("a").get(0).html() 

возвращает ошибку.

03-02 11:30:14.239 15253-15280/? D/JM﹕ Stack [1]: java.util.ArrayList.get(ArrayList.java:308) 
03-02 11:30:14.239 15253-15280/? D/JM﹕ Stack [2]: com.jmtech.jordi.mwc.BackgroundWorker.update_r_n(BackgroundWorker.java:374) 
03-02 11:30:14.239 15253-15280/? D/JM﹕ Stack [3]: com.jmtech.jordi.mwc.BackgroundWorker.access$500(BackgroundWorker.java:54) 
03-02 11:30:14.239 15253-15280/? D/JM﹕ Stack [4]: com.jmtech.jordi.mwc.BackgroundWorker$UpdateRaster_Raster_Notify.run(BackgroundWorker.java:355) 
03-02 11:30:14.239 15253-15280/? D/JM﹕ Stack [5]: java.util.Timer$TimerImpl.run(Timer.java:284) 
03-02 11:30:14.239 15253-15280/? D/JM﹕ java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 


это сайт школы: http://maaswaal.roosternet.nl/?les=3H1
я не могу скопировать & вставить HTML, потому что StackOverflow в вопрос ДИВ передает код на сайт, извините.
Спасибо за ваше время, чтобы ответить уже

ответ

4

Я не вижу никаких tbody в HTML-источнике - но вы пытаетесь получить к нему доступ.

Удалить все .getElementsByTag("tbody").get(0) и попробуйте.


Я только что проверил - я понимаю, что происходит!

Когда она выполняется - 2-й и 3-й таблицы строки

doc.body().getElementsByTag("div").get(0).getElementsByTag("table").get(1).getElementsByTag("tr").get(2)

возвращает ниже раздел выделенного между **. Потому что есть тег tr. Он не дает вам всех строк на одном уровне.

<table class="maintableles"> 
     <tr> 
      <th>3H1</th> 
      <th class="lesdagen">maandag</th> 
      <th class="lesdagen">dinsdag</th> 
      <th class="lesdagen">woensdag</th> 
      <th class="lesdagen">donderdag</th> 
      <th class="lesdagen">vrijdag</th> 
     </tr> 
     <tr> 
      <th class="lesuren"> 
       <div class="lesurendiv">1e uur</div> 
      </th> 
      <td> 
       <table> 
       **<tr> 
        <td><a href="?les=BRS">BRS</a></td> 
        <td><a title="rekenen">rek</a></td> 
        <td align="right"><a href="?les=V110">V110</a></td> 
       </tr>** 
       </table> 
      </td> 
      <td> 

Вы можете использовать селектор CSS для этого, которое легче по сравнению с вашим подходом !!.

doc.select("body > div > table.maintableles > tbody > tr:nth-child(3) > td:nth-child(2) > table > tbody > tr > td:nth-child(1) > a").html()

+0

плохо тест это прямо сейчас –

+0

@JMgamerZzzTM, что текст, который вы пытаетесь получить доступ? – vins

+0

не работал, по-прежнему имеет ту же ошибку, что и ошибка, нарушила часть кода по частям и обнаружила, что ошибка будет происходить именно здесь: doc.body(). GetElementsByTag ("div"). Get (0) .getElementsByTag ("table") .get (1) .getElementsByTag ("TBODY"). получаем (0) .getElementsByTag ("TR"). получаем (2) .getElementsByTag ("TD"). получаем (0). где вторая таблица пытается собраться –