Jsoup доза не правильно разобрать тег заголовка - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть пример HTML-документа, когда я использую Jsoup для его анализа, я нахожу, что тег title анализируется как дочерний узел тега body вместо тега head по ошибке. Это ошибка? Ниже приводится тестовая программа и пример HTML-документа.

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Test {
    public static void main(String[] args) throws IOException {
        String s= FileUtils.readFileToString(new File(Test.class.getResource("test.html").getFile()), StandardCharsets.UTF_8);
        Document doc= Jsoup.parse(s);
        System.out.println(doc.select("body > title").first());
        System.out.println(doc.select("head > title").first());
    }
}

пример HTML-документа

1 Ответ

0 голосов
/ 16 ноября 2018

Я попробовал приведенный выше код, но с модификацией:

public class Main {

    public static void main(String[] args) {
        String html = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
                "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
                "<head>\n" +
                "  <title>404</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "</body>\n" +
                "</html>\n";

        Document document = Jsoup.parse(html);
        System.out.println(document.select("head > title").text());
        System.out.println(document.select("title").text());
        System.out.println(document.select("body > title").text());
    }
}

Здесь я определяю строку под названием "html", и я инициализирую ее с помощью HTML-кода, которым вы поделились через OneDrive, и он работает какожидается.Если вы выбираете тег заголовка, а затем вложенный тег заголовка, он печатает 404 и так далее, если вы просто выбираете тег заголовка.Но если вы попытаетесь выбрать тег body, а затем вложенный тег title, он просто напечатает пустой, потому что он не существует.

Ошибка, которая у вас возникла, я думаю, это потому, что метод импорта HTML, потому что он изменяет свою структуру, или чтение документа неверно.Поэтому проверьте этот фрагмент кода и подумайте о его замене:

String s = FileUtils.readFileToString(new File(Test.class.getResource("test.html").getFile()), StandardCharsets.UTF_8);

Чтобы решить вашу проблему в этом конкретном случае, вы можете просто выбрать тег заголовка, поскольку он будет уникальным во всем HTML.При выборе JSOUP вам не нужно выбирать каждый элемент сверху, пока тот элемент, который вы действительно хотите выбрать, вы можете выбрать его напрямую, если у него есть какой-либо идентификатор.

Если вам нужно что-либо, связанное с выбором CSSиз JSOUP, взгляните на Примеры синтаксиса выбора JSOUP CSS .

Надеюсь, это помогло вам!Если вам нужно что-то еще, не стесняйтесь спрашивать!

...