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 */