java - JSOUP 为 html 添加额外的编码内容

标签 java html-parsing jsoup

实际上,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);

但是由于某种原因找不到 Entities 类并给出错误。 我包含的库是

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> &lt;/div&gt; &lt;/div&gt; &lt;/body&gt; &lt;/html&gt;
   </div>
  </div>
 </body>
</html>

iframe 元素已添加一些编码内容。

请帮忙。

谢谢 自治

最佳答案

实际上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>

如果您检查编码的内容,您会发现它们正在关闭标签。

&lt;/div&gt;  = </div> 
&lt;/div&gt;  = </div>
&lt;/body&gt; = </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 之后的结束标记的问题,因为它将是有效的。

关于java - JSOUP 为 html 添加额外的编码内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20908946/

相关文章:

java - 如何使用 gremlin PipeLine 获取最后一级值未知的特定顶点的最后一级顶点

javax.swing.text.ElementIterator 奇怪的行为

php - 无法识别重音 + 请求超链接时出错

c# - 使用 Regex 或 XmlParser 替换标签中未包含的文本

java - PostgreSQL 驱动程序 "Unable to load class "

java - 由于临时原因 SMTP 不可用

java - 登录网站并进一步浏览

java - 我怎样才能直接忽略这个标签来使用 JSOUP 只使用文本信息?

android - JSoup 不解析 Android 已知问题页面

java - PHP 中的 256 位 AES 解密