如何解决jsoup HTML 片段检测
我正在解析一个 html 片段,但并不知道这是一个片段。 我使用 jsoup HTML 解析器。 例如:
String html = "<script>document.location = \"http://example.com/\";</script>";
Document document = Jsoup.parse(html);
System.out.println(document.html());
输出:
<html>
<head>
<script>document.location = "http://example.com/";</script>
</head>
<body></body>
</html>
问题:有没有办法知道 <html>
、<head>
和 <body>
标签是由 Jsoup 添加的,并且不在原始 html 片段中?
更新:
我也尝试启用错误跟踪:
Parser parser = Parser.htmlParser();
parser.setTrackerrors(500);
Document document = parser.parseInput(html,"example.com");
ParseErrorList errors = parser.getErrors();
解决方法
最简单的方法是将其解析为 XML 和 HTML,然后比较两个结果的元素计数。 XML parser 不会自动添加元素,而 HTML 解析器会自动添加缺失的可选标签并执行其他规范化。
这是一个例子:
@Test public void detectAutoElements() {
String bare = "<script>One</script>";
String full =
"<html><head><title>Check</title></head><body><p>One</p></body></html>";
assertTrue(didAddElements(bare));
assertFalse(didAddElements(full));
}
private boolean didAddElements(String input) {
// two passes,one as XML and one as HTML. XML does not vivify missing/optional tags
Document html = Jsoup.parse(input);
Document xml = Jsoup.parse(input,"",Parser.xmlParser());
int htmlElementCount = html.getAllElements().size();
int xmlElementCount = xml.getAllElements().size();
boolean added = htmlElementCount > xmlElementCount;
System.out.printf(
"Original input has %s elements; HTML doc has %s. Is a fragment? %s\n",xmlElementCount,htmlElementCount,added);
return added;
}
结果如下:
Original input has 2 elements; HTML doc has 5. Is a fragment? true
Original input has 6 elements; HTML doc has 6. Is a fragment? false
根据您的需要,您可以扩展它以更深入地比较两种文档结构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。