Jsoup没有正确解析标题标签

时间:2018-11-16 07:59:05

标签: jsoup

我有一个示例html文档,当我使用Jsoup解析它时,我发现标题标签被错误地解析为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());
    }
}

example html document

1 个答案:

答案 0 :(得分:0)

我已经尝试了上面的代码,但是做了修改:

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”的字符串,并使用您通过OneDrive共享的HTML代码对其进行了初始化,它可以按预期工作。如果选择了head标签,然后选择了嵌套的title标签,则它会打印404,依此类推,如果您只是选择title标签。但是,如果您尝试选择body标签,然后再选择嵌套的title标签,则由于它不存在,它只会显示空白。

您可能遇到的错误是因为HTML导入方法,因为它修改了其结构或文档读取错误。因此,请检查该段代码,并考虑将其替换:

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

要解决这种特殊情况下的问题,您只需选择title标记,因为它在整个HTML中是唯一的。选择JSOUP不需要您从顶部选择每个元素,直到您真正想要选择的元素为止,如果它具有任何类型的标识符,则可以直接选择它。

如果您需要有关JSOUP的CSS选择的任何内容,请查看JSOUP CSS Selection Syntax examples

希望这对您有所帮助!如果您还有其他需要,请随时询问!