【问题标题】:Jsoup - parsing data from table in JavaJsoup - 从 Java 中的表中解析数据
【发布时间】:2020-06-19 07:57:00
【问题描述】:

我正在尝试制作一个解析器来获取已出现的最新 SQL 版本(仅限构建版本)。 他收到一个错误,以及他不需要的附加文本。 我做错了什么?

Document doc = Jsoup.connect("https://buildnumbers.wordpress.com/sqlserver/").get();
Elements trs = doc.select("tr");

//remove header row
trs.remove(0);

for (Element tr : trs) {
            Elements tds = tr.getElementsByTag("td");
            Element td = tds.last();
            System.out.println(td.text());
}

【问题讨论】:

    标签: java parsing jsoup


    【解决方案1】:

    附加文字

    您的问题与 Jsoup 无关。它提取的值与表格单元格中的值完全一样,它不能再帮助你了。 您现在可以尝试使用子字符串删除您不想要的文本,因此替换该行

    System.out.println(td.text());
    

    使用此代码:

    String text = td.text();
    if (text.contains("(")) {
        text = text.substring(0, text.indexOf("(")-1);
    }
    System.out.println(text);
    

    它将只保留( 字符之前的文本。

    NullPointerException

    您正在解析的页面包含许多表。您执行doc.select("tr"),这意味着您的trs 变量包含此页面上每个表的每个tr。当您的代码遇到标题行不包含任何 td 的第二个表时会发生异常,因为它看起来像这样:

    <tr>
       <th style="padding:4px;background-color:#f0f0f0;width:10%;">SQL Server</th>
       <th style="padding:4px;background-color:#f0f0f0;width:10%;">Analysis Services</th>
       <th style="padding:4px;background-color:#f0f0f0;width:65%;">Description</th>
       <th style="padding:4px;background-color:#f0f0f0;width:15%;">Release Date</th>
    </tr>
    

    解决方案是将选择限制为仅第一个表,因此替换行:

    Elements trs = doc.select("tr");
    

    Element firstTable = doc.select("table").first();
    Elements trs = firstTable.select("tr");
    

    【讨论】:

      【解决方案2】:

      您需要使用String::substring 去掉每个文本末尾的(...)。此外,您错过了null 在您的程序中到处检查。

      按如下方式进行:

      import java.io.IOException;
      
      import org.jsoup.Jsoup;
      import org.jsoup.nodes.Document;
      import org.jsoup.nodes.Element;
      import org.jsoup.select.Elements;
      
      public class Main {
          public static void main(String[] args) throws IOException {
              Document doc = Jsoup.connect("https://buildnumbers.wordpress.com/sqlserver/").get();
              Elements trs = doc.select("tr");
      
              // remove header row
              trs.remove(0);
      
              String text;
              int i;
              for (Element tr : trs) {
                  Elements tds = tr.getElementsByTag("td");
                  Element td;
                  if (tds != null) {
                      td = tds.last();
                      if (td != null) {
                          text = td.text();
                          if (text != null) {
                              i = text.indexOf("(");
                              if (i != -1) {
                                  System.out.println(text.substring(0, i).trim());
                              }
                          }
                      }
                  }
              }
          }
      }
      

      输出:

      15.0.4013.40
      14.0.3281.6
      13.0.5698.0
      ...
      ...
      ...
      SSMS 16.4
      SSMS 16.3
      

      【讨论】:

      • 这个解决方案没有显示:15.0.4013.40, 14.0.3281.6 结果,为什么?
      • @Ebasse - 网站内容已更改,现在您将看到 13.0.5698.0 12.0.6372.1 ...。只需在浏览器中访问网址buildnumbers.wordpress.com/sqlserver,您就会明白。
      猜你喜欢
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 2014-05-31
      • 2013-12-21
      相关资源
      最近更新 更多