如何使用 JSoup 在 wiki 页面中的两个节点之间提取数据?
How to extract data between two nodes in a wiki page with JSoup?
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()
}
- 我想从"set (język angielski)"得到所有的意思(znaczenia:
)
结果应该是一对:
rzeczownik - (1.1) zestaw
rzeczownik - (1.2) mat. zbiór (lub bez nawiasów)
...
przymiotnik - (2.1) gotowy
...
以下是我的尝试方式:
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());
}
}
输出
rzeczownik - (1.1) zestaw
rzeczownik - (1.2) mat. zbiór
rzeczownik - (1.3) elektron. odbiornik, aparat odbiorczy
rzeczownik - (1.4) film. plan zdjęciowy
rzeczownik - (1.5) sport. set
rzeczownik - (1.6) teatr. dekoracja
rzeczownik - (1.7) tendencja, kierunek
rzeczownik - (1.8) koteria
rzeczownik - (1.9) nora borsuka
rzeczownik - (1.10) masz. agregat
przymiotnik - (2.1) gotowy
przymiotnik - (2.2) stały, ustalony
przymiotnik - (2.3) nieruchomy
przymiotnik - (2.4) postanowiony
przymiotnik - (2.5) określony
czasownik - (3.1) układać, ustawiać
czasownik - (3.2) nastawiać (kość)
czasownik - (3.3) prostować
czasownik - (3.4) przygotowywać
czasownik - (3.5) powodować
czasownik - (3.6) o słońcu: zachodzić
czasownik - (3.7) ustalać
IMO,你应该尝试找到一个 wiki API。虽然数据似乎在页面之间共享相同的表示,但其背后的 html 代码可能会有所不同。
讨论
以上代码的关键是CSS查询。
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
此查询选择两个 h2
节点之间的 p
个节点。为了实现这个目标,这里是如何做到的:
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 */
在 JSoup 1.8.3 上测试
编辑:
OP 建议 JWBF (Java Wiki Bot Framework) 作为 wiki API.
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()
}
- 我想从"set (język angielski)"得到所有的意思(znaczenia: )
结果应该是一对:
rzeczownik - (1.1) zestaw rzeczownik - (1.2) mat. zbiór (lub bez nawiasów) ... przymiotnik - (2.1) gotowy ...
以下是我的尝试方式:
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());
}
}
输出
rzeczownik - (1.1) zestaw
rzeczownik - (1.2) mat. zbiór
rzeczownik - (1.3) elektron. odbiornik, aparat odbiorczy
rzeczownik - (1.4) film. plan zdjęciowy
rzeczownik - (1.5) sport. set
rzeczownik - (1.6) teatr. dekoracja
rzeczownik - (1.7) tendencja, kierunek
rzeczownik - (1.8) koteria
rzeczownik - (1.9) nora borsuka
rzeczownik - (1.10) masz. agregat
przymiotnik - (2.1) gotowy
przymiotnik - (2.2) stały, ustalony
przymiotnik - (2.3) nieruchomy
przymiotnik - (2.4) postanowiony
przymiotnik - (2.5) określony
czasownik - (3.1) układać, ustawiać
czasownik - (3.2) nastawiać (kość)
czasownik - (3.3) prostować
czasownik - (3.4) przygotowywać
czasownik - (3.5) powodować
czasownik - (3.6) o słońcu: zachodzić
czasownik - (3.7) ustalać
IMO,你应该尝试找到一个 wiki API。虽然数据似乎在页面之间共享相同的表示,但其背后的 html 代码可能会有所不同。
讨论
以上代码的关键是CSS查询。
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
此查询选择两个 h2
节点之间的 p
个节点。为了实现这个目标,这里是如何做到的:
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 */
在 JSoup 1.8.3 上测试
编辑: OP 建议 JWBF (Java Wiki Bot Framework) 作为 wiki API.