Разобрать или преобразовать HTML код, встроенный в JSON объект в ответе JSON - PullRequest
1 голос
/ 01 марта 2020

У меня есть следующий URL:

https://en.wikipedia.org/w/api.php?action=parse&section=0&prop=text&format=json&page=The%20Matrix

, который возвращает JSON ответ с HTML код , встроенный в JSON объект ( См. ссылку ).

Как мне извлечь детали, такие как актер, режиссер и c из этой HTML детали, используя java?

Как мне преобразовать эту Html часть в JSON, используя java, если это возможно?

Или есть ли способ изменить сам URL, чтобы получить mov ie данные в читаемом JSON формате?

1 Ответ

2 голосов
/ 01 марта 2020

Вот решение, использующее jsoup для разбора HTML и Джексона для разбора JSON:

public static void main(String[] args) throws IOException {
    // Extract JSON string
    String body = Jsoup.connect("https://en.wikipedia.org/w/api.php?action=parse&section=0&prop=text&format=json&page=The%20Matrix")
    .ignoreContentType(true).execute().body();
    // Extract HTML string from JSON
    JsonFactory factory = new JsonFactory();
    ObjectMapper mapper = new ObjectMapper(factory);
    JsonNode targetNode = mapper.readTree(body).get("parse").get("text").get("*");
    // Generic but fragile function to extract specific details
    Function<String, String> retrieveDetailsOf = detailsOf ->
        Jsoup.parse(targetNode.asText())
                .select(".infobox tr th:contains(" + detailsOf + ") ~ td a[title]")
                .stream().map(e -> e.attr("title")).collect(Collectors.toList()).toString();

    System.out.println(retrieveDetailsOf.apply("Directed by"));
    System.out.println(retrieveDetailsOf.apply("Produced by"));
    System.out.println(retrieveDetailsOf.apply("Music by"));
    System.out.println(retrieveDetailsOf.apply("Starring"));
}

Выход:

[The Wachowskis]
[Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss, Hugo Weaving, Joe Pantoliano]

Зависимости:

implementation("org.jsoup:jsoup:1.12.2")
implementation("com.fasterxml.jackson.core:jackson-core:2.10.2")
implementation("com.fasterxml.jackson.core:jackson-databind:2.10.2")

Просто помните о том, что любые изменения в структуре контента в основном приводят к перерывам. Скорее используйте официальные API деталей mov ie, если они доступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...