我有一个示例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());
}
}
答案 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。
希望这对您有所帮助!如果您还有其他需要,请随时询问!