【问题标题】:Jsoup getElementsByTagJsoup getElementsByTag
【发布时间】:2016-03-03 08:46:16
【问题描述】:

我正在为我的学校创建一个应用程序,以便更轻松地查看您的课程。我正在使用他们的网站,但他们显然没有简单的 API。所以我需要喜欢阅读该网站并将所有内容都整理出来。 (表层深处的单个标签)。
所以这就是我目前正在使用的:

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()

doc = 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 的问题 div 会将代码传输到网站,抱歉。
感谢您抽出宝贵时间回复

【问题讨论】:

    标签: java android html jsoup


    【解决方案1】:

    我在 HTML 源代码中没有看到任何 tbody - 但您正在尝试访问它。

    删除所有.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 &gt; div &gt; table.maintableles &gt; tbody &gt; tr:nth-child(3) &gt; td:nth-child(2) &gt; table &gt; tbody &gt; tr &gt; td:nth-child(1) &gt; a").html()

    【讨论】:

    • @JMgamerZzzTM,您要访问哪个文本?
    • 没有工作,仍然有相同的错误,我逐部分破坏代码并发现错误会发生在这里:doc.body().getElementsByTag("div").get(0 ).getElementsByTag("table").get(1).getElementsByTag("tbody").get(0).getElementsByTag("tr").get(2).getElementsByTag("td").get(0)。试图收集第二张桌子的地方
    • 如果您访问该站点,您会在表格选项卡中看到名称(快捷方式)、房间号和课程快捷方式。我试图将它们全部放入按天/小时排序的数组中。
    • 按日期分隔可以在java中完成我只需要修复它无法找到实际存在的元素的错误。
    • 你用的是什么浏览器,我用谷歌浏览器看不到?
    猜你喜欢
    • 2012-09-13
    • 2013-06-27
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多