簡體   English   中英

Jsoup - 從 Java 表中解析數據

[英]Jsoup - parsing data from table in Java

我正在嘗試制作一個解析器來獲取出現的最新 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());
}

在此處輸入圖片說明

您需要使用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

附加文本

您的問題與 Jsoup 無關。 它提取的值與表格單元格中的值完全一樣,並且無法再為您提供幫助。 您現在可以嘗試使用子字符串刪除您不想要的文本,因此請替換該行

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

使用此代碼:

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

它將只保留(字符。

空指針異常

您正在解析的頁面包含許多表格。 您執行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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM