实际上JSOUP在我的jSOUP解析器中为我的HTML添加了一些额外的编码值。我正在尝试通过
来处理它String url = "http://iqtestsites.adtech.de/pictelatest/custombkgd/StylelistDevil.html";
System.out.println("Fetching %s..."+url);
Document doc = Jsoup.connect(url).get();
//System.out.println(doc.html());
Document.OutputSettings settings = doc.outputSettings();
settings.prettyPrint(false);
settings.escapeMode(Entities.EscapeMode.base);
settings.charset("ASCII");
String html = doc.html();
System.out.println(html);
但是由于某种原因找不到实体类并且发出错误。 我包括的lib是
import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
原始HTML
<!DOCTYPE html>
<html xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" class="SAF" id="global-header-light">
<head>
</head>
<body>
<div style="background-image: url(http://aka-cdn-ns.adtech.de/rm/ads/23274/HPWomenLOFT_1381687318.jpg);background-repeat: no-repeat;-webkit-background-size: 1001px 2059px; height: 2059px; width: 1001px; text-align: center; margin: 0 auto;">
<div style="height:2058px; padding-left:0px; padding-top:36px;">
<iframe style="height:90px; width:728px;" />
</div>
</div>
</body>
</html>
JSOUP的doc.html()
给出了这个:
<!DOCTYPE html>
<html xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" class="SAF" id="global-header-light">
<head>
<style>
</style>
</head>
<body>
<div style="background-image: url(aol.jpeg); background-repeat: no-repeat;-webkit-background-size:90720;height:720; width:90; text-align: center; margin: 0 auto;">
<div style="height:450; width:100; padding-left:681px; padding-top:200px;">
<iframe style="height:1050px; width:300px;"></iframe> </div> </div> </body> </html>
</div>
</div>
</body>
</html>
iframe元素已添加了一些编码内容。
请帮忙。
由于 斯瓦拉杰
答案 0 :(得分:4)
实际上jsoup没有添加编码的东西。 Jsoup只是添加了似乎的结束标记。让我解释。
首先,jsoup尝试格式化你的html。在您的情况下,这意味着它将添加缺少的结束标记。 示例强>
Document doc = Jsoup.parse("<div>test<span>test");
System.out.println(doc.html());
输出:
<html>
<head></head>
<body>
<div>
test
<span>test</span>
</div>
</body>
</html>
如果你检查编码的东西,你会发现它们正在关闭标签。
</div> = </div>
</div> = </div>
</body> = </body>
如果你去网站并按 Ctrl + U (使用chrome)那么你会看到什么是jsoup 将解析。 Chrome会为其识别的有效html标记添加颜色。由于某些奇怪的原因,它无法识别底部的标签(与转义字符一起出现的标签)。出于同样的原因,jsoup也存在关闭标签的问题。它不会将它们视为结束标记,而是将其视为文本,因此它将它们转义,然后通过添加这些标记来规范化html,如前所述。
修改强> 我设法复制了这种行为。
Document doc = Jsoup.parse("<iframe /><span>test</span>");
System.out.println(doc.html());
您可以看到完全相同的行为。问题在于自关闭iframe。这样做可以解决问题
Document doc = Jsoup.parse("<iframe></iframe><span>test</span>");
System.out.println(doc.html());
编辑2 如果您只想接收html而不构建文档对象,则可以执行此操作
Connection.Response html = Jsoup.connect("http://iqtestsites.adtech.de/pictelatest/custombkgd/StylelistDevil.html").execute();
System.out.println(html.body());
完成上述操作后,您可以找到自关闭iframe并将其替换为有效表示(或完全删除)。然后你可以用Jsoup.parse()
解析该字符串
这将解决在iframe之后无法识别结束标记的问题,因为它将是有效的。