当前位置: 首页 > 面试题库 >

如何在Jsoup解析中避免围绕html head标签

彭硕
2023-03-14
问题内容

我使用Jsoup尝试解析给定的html内容。在Jsoup.parse()之后,html输出将html,head和body标签附加到输入中。我只想忽略这些。

输入样例:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>

Java代码:

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class HTMLParse {

    public static void main(String args[]) throws IOException {
        try{
            File input = new File("/ab.html");
            String html = FileUtils.readFileToString(input, null);

            Document doc = Jsoup.parseBodyFragment(html);
            doc.outputSettings().prettyPrint(false);
            System.out.println(doc.html());
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

实际输出:

<html><head></head><body><p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
    </body></html>

预期产量:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>

请帮忙。


问题答案:

原因:

parseBodyFragment()以及所有其他的parse()-方法使用 的HTML解析器默认 。而那些加
的HTML壳牌(<html>…</html><head>…</head>等等)。

解决方案:

只是不要使用HTML解析器,而应使用 XML解析器 ;-)

Document doc = Jsoup.parse(html, "", Parser.xmlParser());

替换该单行,您的问题就解决了。

例:

final String html = "<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>";

Document docHtml = Jsoup.parse(html);
Document docXml = Jsoup.parse(html, "", Parser.xmlParser());

System.out.println("******* HTML *******\n" + docHtml);
System.out.println();
System.out.println("*******  XML *******\n" + docXml);

输出:

******* HTML *******
<html>
 <head></head>
 <body>
  <p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
 </body>
</html>

*******  XML *******
<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>


 类似资料:
  • 我正在尝试转义字符串中的XML特殊字符。转义由静态方法处理,如下所示。 现在,这种实现的问题是,我得到了一段字符串,它可能被解析,也可能不被解析。这导致输出不规则。 例如: 现在,为了得到正确的响应,我计划在静态方法中引入一个检查。通过使用if条件,如下所示。 这是一种正确的实施方式吗?如果不是,请提出建议?

  • 我试图在这里使用JSOUP解析html标记。我对jsoup是新来的。基本上,我需要解析这些标记,获取这些标记中的文本,并应用class属性中提到的样式。 我正在创建一个SpannableStringBuilder,它可以创建子字符串,应用样式,并将它们附加到没有样式的文本中。 我不确定如何解析不在任何标记之间的字符串,例如“there are”和“worker from the”。 需要输出,例如

  • 问题内容: 我有以下选择查询创建: jOOQ生成以下查询: 查询应为: 后者查询在PostgreSQL中完美地工作。表别名不应用引号引起来。 这是一个错误吗? (请注意,该查询非常愚蠢。我正在使用jOOQ进行评估。) 以下“黑客”作品: 问题答案: 默认情况下,jOOQ会将所有标识符包装在引号中,以便能够正确处理区分大小写的情况。 令人困惑的部分是为什么这么做并不是为了做到而是为了做到。原因是jO

  • 问题内容: 我目前正在使用DOM解析器来解析XHTML文档,例如: 我的问题是,当我的文档包含一个实体引用时,例如: 我的解析器为包含“€”而不是“&euro;”的内容创建了一个Text节点。这就是说,它正在按预期的方式解析实体(XHTML 1.0 Strict DTD链接到ENTITIES Latin1 DTD,这反过来确定了“&euro;”与“€”的对等)。 问题是,我不希望解析器执行此类操作

  • 我实际上正在用Java开发一个文本解析器,有人要求我通过用它解析HTML来增强它。解析器的目的是将被解析的文件分成另外三个文件,一个包含文件中包含的所有单词,一个包括所有句子,另一个包含所有问题。 *.txt部分工作得很好,但我在解析HTML时遇到了一个问题。 我创建了一个扩展名为*.txt的临时文件,并将其在我的文本解析器中传递,但是如果我传递一个带有HTML文件链接的URL,其格式如下所示:

  • 问题内容: 对于stackoverflow社区,我创建了此方法以将一些EditText字段翻倍。我添加了if语句专门用于避免解析错误,因为我知道我的几个EditText字段将留为空白。但是,它们仍然在运行时继续运行。有人知道避免解析空白字段的正确方法吗?非常感谢你。 问题答案: 你为什么不尝试这样的事情? 编辑:请注意,这未经测试…此处没有编译器。:’( 由于如果字符串为null,则抛出Numbe