无法使用 jsoup 检索 table 个元素
Unable to retrieve table elements using jsoup
我刚开始使用 jsoup,我正在努力检索名称为 class 的表:verbtense
以及 headers:Present
和 Past
,在来自此站点的名为 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
对象中获取所需内容的初始方法。
我刚开始使用 jsoup,我正在努力检索名称为 class 的表:verbtense
以及 headers:Present
和 Past
,在来自此站点的名为 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
对象中获取所需内容的初始方法。