无法使用 jsoup 检索 table 个元素

Unable to retrieve table elements using jsoup

我刚开始使用 jsoup,我正在努力检索名称为 class 的表:verbtense 以及 headers:PresentPast,在来自此站点的名为 Indicative 的 div 下:https://www.verbix.com/webverbix/Swedish/misslyckas

我已开始尝试执行以下操作,但一开始没有任何结果:

Document document = Jsoup.connect("https://www.verbix.com/webverbix/Swedish/misslyckas").get();
Elements tables = document.select("table[class=verbtense]"); // empty

我也试过这个,但还是没有结果:

        Document document = Jsoup.connect("https://www.verbix.com/webverbix/Swedish/misslyckas").get();

        Elements divs = document.select("div");


        if (!divs.isEmpty()) {
            for (Element div : divs) {
                // all of these are empty
                Elements verbTenses = div.getElementsByClass("verbtense");
                Elements verbTables = div.getElementsByClass("verbtable");
                Elements tables = div.getElementsByClass("table verbtable");
            }
        }

我做错了什么?

您尝试 抓取 的页面在客户端动态生成内容(javascript),因此您将能够使用 javascript 提取数据=26=]

您也许可以 从该网页正在进行的 API 调用中抓取 一些内容,例如 https://api.verbix.com/conjugator/iv1/ab8e7bb5-9ac6-11e7-ab6a-00089be4dcbc/1/21/121/misslyckas

检查浏览器控制台以查看页面在做什么,然后做同样的事情

第一个问题是此页面使用 AJAX 异步加载其内容并使用 JavaScript 将内容添加到 DOM。您甚至可以短时间看到装载机。

Jsoup 无法解析和执行 JavaScript 所以你得到的只是初始页面:( 下一步将是检查浏览器在做什么以及此附加内容的来源是什么。您可以使用 Chrome 的调试器 (Ctrl + Shift + i) 检查它。如果你打开网络选项卡,select 只有 XHR 通信并刷新页面你可以看到两个请求:

其中一个得到这样的内容https://api.verbix.com/conjugator/iv1/ab8e7bb5-9ac6-11e7-ab6a-00089be4dcbc/1/21/121/misslyckas 如您所见,它是一个 JSON 和 HTML 片段,并且此内容似乎具有您需要的动词形式。但这是另一个问题,因为不幸的是 Jsoup 无法解析 JSON :( 所以你必须使用另一个库来获取 HTML 片段,然后你可以使用 Jsoup 解析它。 下载 JSON 的一般建议是忽略内容类型(Jsoup 会抱怨它不支持 JSON):

String json = Jsoup.connect("https://api.verbix.com/conjugator/iv1/ab8e7bb5-9ac6-11e7-ab6a-00089be4dcbc/1/21/121/misslyckas").ignoreContentType(true).execute().body();

然后 你必须使用一些 JSON 解析库,例如 json-simple 获取 html 片段然后你可以用 Jsoup 将它解析为 HTML:

String json = Jsoup.connect(
    "https://api.verbix.com/conjugator/iv1/ab8e7bb5-9ac6-11e7-ab6a-00089be4dcbc/1/21/121/misslyckas")
    .ignoreContentType(true).execute().body();
System.out.println(json);
JSONObject jsonObject = (JSONObject) JSONValue.parse(json);
String htmlFragmentObtainedFromJson = (String) ((JSONObject) jsonObject.get("p1")).get("html");
Document document = Jsoup.parse(htmlFragmentObtainedFromJson);
System.out.println(document);

现在您可以尝试使用 select 或从 document 对象中获取所需内容的初始方法。