Java 如何使用JSoup在wiki页面的两个节点之间提取数据? 我想从“set(język angielski)”中得到所有含义(znaczenia: )
结果应该是一对:Java 如何使用JSoup在wiki页面的两个节点之间提取数据? 我想从“set(język angielski)”中得到所有含义(znaczenia: ),java,jsoup,mediawiki-api,wiktionary,Java,Jsoup,Mediawiki Api,Wiktionary,结果应该是一对: Document doc = getDocumen("https://pl.wiktionary.org/wiki/set#set_.28j.C4.99zyk_angielski.29"); Elements links = doc.select("dfn[style]"); - ?? for (Element link : links) { link.select("a [href]"); String linkText = link.text() } 以下是我将
Document doc = getDocumen("https://pl.wiktionary.org/wiki/set#set_.28j.C4.99zyk_angielski.29");
Elements links = doc.select("dfn[style]"); - ??
for (Element link : links)
{
link.select("a [href]");
String linkText = link.text()
}
- 以下是我将如何尝试:
rzeczownik - (1.1) zestaw
rzeczownik - (1.2) mat. zbiór (lub bez nawiasów)
...
przymiotnik - (2.1) gotowy
...
输出
rzeczownik-(1.1)zestaw
rzeczownik-(1.2)垫。兹比奥
rzeczownik-(1.3)elektron。odbiornik,aparat odbiorczy
rzeczownik-(1.4)胶片。zdjęciowy平面图
rzeczownik-(1.5)运动。设置
rzeczownik-(1.6)teatr。德科拉卡
rzeczownik-(1.7)基鲁内克滕登加
rzeczownik-(1.8)koteria
rzeczownik-(1.9)nora borsuka
rzeczownik-(1.10)马斯茨。阿格雷特
przymiotnik-(2.1)gotowy
przymiotnik-(2.2)斯塔尼,乌斯塔罗尼
przymiotnik-(2.3)nieruchomy
przymiotnik-(2.4)事后通知
przymiotnik-(2.5)określony
czasownik-(3.1)układać,ustawiać
czasownik-(3.2)nastawiać(kość)
czasownik-(3.3)Prosować
czasownik-(3.4)Przgotowywać
czasownik-(3.5)powodować
czasownik-(3.6)o słońcu:zachodzić
czasownik-(3.7)ustalać
在我看来,你应该试着找到一个维基API。尽管数据在不同页面之间似乎共享相同的表示,但其背后的html代码可能会有所不同
讨论
上面代码的关键是CSS查询
Document doc = getDocumen("https://pl.wiktionary.org/wiki/set#set_.28j.C4.99zyk_angielski.29");
Elements elements = doc.select("h2:has(span#en) ~ p:not(h2:has(span#en) ~ p ~ h2 ~ p) i, h2:has(span#en) ~ p:not(h2:has(span#en) ~ p ~ h2 ~ p) + dl > dd");
if (elements.isEmpty()) {
throw new RuntimeException("No definitions found.");
}
String parent = null;
for (Element element : elements) {
switch (element.tagName().toLowerCase()) {
case "i":
parent = element.text();
break;
case "dd":
System.out.println(parent + " - " + element.text());
break;
default:
throw new RuntimeException("Unexpected element:\n" + element.outerHtml());
}
}
此查询选择两个h2
节点之间的p
节点。为了实现这一目标,以下是如何做到这一点:
h2:has(span#en) ~ p:not(h2:has(span#en) ~ p ~ h2 ~ p) i, h2:has(span#en) ~ p:not(h2:has(span#en) ~ p ~ h2 ~ p) + dl > dd
在JSoup 1.8.3上测试
编辑:
OP建议(Java Wiki机器人框架)作为Wiki API。您可以使用解析器获得所需的内容。看看这个链接-。可能是你迄今为止尝试过的内容的重复,为什么你对这些结果不满意?我只能访问第一部分“set(język polski)”。我不知道如何在各个部分之间导航,也不知道如何阅读它们的意思我得到了“未找到定义”:(关于wiki Api。我尝试了jwbf,但我不知道如何使用它)api@user2721692哪个url为您提供了“未找到定义”?@user2721692暂时使用Jsoup,让jwbf用于边缘情况。@user2721692实际上,当加载页面时,会执行一些javascript。在执行javascript之前,我重建了de CSS查询以处理html代码。我已经相应地更新了代码。
h2:has(span#en) /* Select the h2 node having the span with id 'en' */
~ p /* Select all p nodes preceded by previous selected h2 node... */
:not(h2:has(span#en) ~ p ~ h2 ~ p) /* ... but ignore any p nodes after the previously selected p nodes */