使用Jsoup

时间:2015-07-15 01:41:32

标签: java jsoup

我需要使用Jsoup帮助我的Java项目(如果你认为有更有效的方法来实现这个目的,请告诉我)。我的程序的目的是解析来自不同URL的某些有用信息并将其放在文本文件中。我不是HTML或JavaScript方面的专家,因此,我很难用Java编码我要解析的内容。 在您在下面的代码中看到的网站作为示例之一,我在Jsoup中解析的信息就是您在“路由”(路由,位置,船只/航程,集装箱到达日期,集装箱出发日期; = Origin,Seattle SSA Terminal T18,26 Jun 15 A,26​​ Jun 15 A ...依此类推)。 到目前为止,使用Jsoup,我们只能解析网站的标题,但我们没有成功获得任何身体。 这是我使用的代码,我从在线来源获得:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

 public class Jsouptest71115 {

    public static void main(String[] args) throws Exception {
 String url = "http://google.com/gentrack/trackingMain.do "
                + "?trackInput01=999061985";
        Document document = Jsoup.connect(url).get();

        String title = document.title();
        System.out.println("title : " + title);

        String body = document.select("body").text();
        System.out.println("Body: " + body);


        }
    }

2 个答案:

答案 0 :(得分:2)

工作代码:

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        String url = "http://homeport8.apl.com/gentrack/blRoutingPopup.do";

        try {
            Connection.Response response = Jsoup.connect(url)
                    .data("blNbr", "999061985")  // tracking number
                    .method(Connection.Method.POST)
                    .execute();

            Element tableElement = response.parse().getElementsByTag("table")
                    .get(2).getElementsByTag("table")
                    .get(2);

            Elements trElements = tableElement.getElementsByTag("tr");
            ArrayList<ArrayList<String>> tableArrayList = new ArrayList<>();

            for (Element trElement : trElements) {
                ArrayList<String> columnList = new ArrayList<>();
                for (int i = 0; i < 5; i++) {
                    columnList.add(i, trElement.children().get(i).text());
                }
                tableArrayList.add(columnList);
            }

            System.out.println("Origin/Location: "
                    +tableArrayList.get(1).get(1));// row and column number

            System.out.println("Discharge Port/Container Arrival Date: "
                    +tableArrayList.get(5).get(3));


        } catch (IOException e) {
            e.printStackTrace();
        }


    }


}

输出:

  

产地/位置:西雅图SSA TERMINAL(T18),WA

     

卸货港/集装箱到货日期:19 Jul 15 E

答案 1 :(得分:0)

您需要利用document.select("body")选择方法输入到CSS选择器。要了解有关CSS选择器的更多信息,只需谷歌或Read this。使用CSS选择器,您可以轻松识别网页主体的各个部分。

在您的特定情况下,您会遇到不同的问题,例如您所在的表位于IFrame内,如果您查看网页的html,则表示您正在访问其(iframe的)网址是“ http://homeport8.apl.com/gentrack/blRoutingFrame.do“,因此如果您直接访问此URL以便访问其内容,您将获得一个例外,这可能是服务器的一些限制。要正确获取内容,您需要通过JSoup访问两个网址,1。http://homeport8.apl.com/gentrack/trackingMain.do?trackInput01=999061985和2. http://homeport8.apl.com/gentrack/blRoutingFrame.do?trackInput01=999061985

对于第一个网址,您将无法获得任何有用信息,但对于第二个网址,您将获得您感兴趣的表格。尝试使用document.select("table"),它将为您提供表列表迭代器,并查找您感兴趣的表。获得表后,使用Element.select(“tr”)获取表行,然后为每个“tr”使用Element.select(“td”)获取表格单元格数据。

您正在访问的网页没有使用CSS类和ID选择器,这样可以更容易地使用jsoup阅读它,所以我担心迭代document.select("table")是您最好和最简单的选择。

祝你好运。