Разбор html-файла с использованием JSOUP и сопоставление его с парами ключ-значение в JAVA

Я проанализировал HTML с помощью Jsoup, и я пытаюсь получить из него пару значений ключа.

Это файл HTML, который содержит ключевые слова в dt dlterm и значения в dd:

<div class = "section" id = "GUID-1BF02E47-1ECC-4CCF-A903-2A8621DB5FBA__GUID- 20A253C1-02AD-4413-9570-C0178C01E616">
  <div class = "p">
    <dl class = "dl">
      <dt class = "dt dlterm">
    <a name = "GUID-1BF02E47-1ECC-4CCF-A903-2A8621DB5FBA__GUID-942CC4F1-90F8- 4B83-9647-A3D086063B0C"><!----></a>Incident</dt>
      <dd class = "dd">detials of one</dd>
      <dt class = "dt dlterm"><a name = "GUID-1BF02E47-1ECC-4CCF-A903- 2A8621DB5FBA__GUID-0F5CFEC5-6714-4000-A733-79DDB49B4C63"><!----> </a>Risk</dt>
      <dd class = "dd">details of it two</dd>
      <dt class = "dt dlterm"><a name = "GUID-1BF02E47-1ECC-4CCF-A903- 2A8621DB5FBA__GUID-C731C50A-947F-431B-9CEE-1FFD1BA40EEA"><!----> </a>Event</dt>
      <dd class = "dd">detials of it three.</dd>
    </dl>
  </div>
</div>

Вот что я пробовал:

static Map<Object, Object> maps;

public static Map<Object, Object> getSet(Document doc) {
    maps = new HashMap<Object, Object>();
    String key  = "";
    String value = "";
    Elements elemname1 = doc.getElementsByClass("dt dlterm");
    Elements elemname2 = doc.getElementsByClass("dd");

    List<Object> keys = new ArrayList<Object>();
    List<Object> values = new ArrayList<Object>();
    for (Element i : elemname1) {
        key = i.ownText();
        keys.add(key);
    }
    for(Element j : elemname2) {
        value = j.ownText();
        values.add(value);
    }
    System.out.println(maps);
    return maps;
}

public static void main (String args[]) throws Exception {
    String filePath  = "someFilePath.html";
    File input = new File(filePath);
    Document doc = Jsoup.parse(input, "UTF-8", "");
    getSet(doc);
}

Ожидаемый результат такой:

{ 
    Event = detials of one,
    Incident = detials of two,
    Risk = detials of three 
}

Что я получаю:

{[Incident, Risk, Event] = [detials of one,detials of two,detials of three]}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
685
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете помещать результаты на карту, собирая их в один цикл. Замените обе петли for на эту:

for (int i = 0; i < elemname1.size(); i++) {
    key = elemname1.get(i).ownText();
    value = elemname2.get(i).ownText();
    maps.put(key, value);
}

выход:

{Risk=details of it two, Event=detials of it three., Incident=detials of one}
Ответ принят как подходящий

Вы можете просто использовать это:

Document document = Jsoup.parse(html);

Elements dts = document.getElementsByClass("dt dlterm");
Elements dds = document.getElementsByClass("dd");

if (dts.size() != dds.size()) {
    // ensure same sizes of both lists
}

HashMap<String, String> values = new HashMap<>();
for (int i = 0; i < dts.size(); i++) {
    values.put(dts.get(i).text(), dds.get(i).text());
}

Или всего одним оператором с использованием Java Streams:

Map<String, String> values = IntStream.range(0, Math.min(dts.size(), dds.size())).boxed()
        .collect(Collectors.toMap(i -> dts.get(i).text(),i -> dds.get(i).text()));

Результат будет таким:

{Risk=details of it two, Event=detials of it three., Incident=detials of one}

Если вы хотите убедиться, что порядок на карте такой же, как в HTML-коде, используйте LinkedHashMap вместо HashMap.

Другие вопросы по теме