Анализ html-файла с использованием JSOUP и сопоставление его с парами ключ-значение в JAVA - PullRequest
1 голос
/ 15 мая 2019

Я проанализировал 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]}

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

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

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:

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.

0 голосов
/ 16 мая 2019

Вы можете поместить результаты в карту, собирая их в один цикл.Замените оба цикла 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}
...