有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Jsoup中关闭关闭标记的自动生成?

我在尝试解析HTML文档时遇到了以下场景。在下面的代码中,我将内容以字符串的形式放置。在这种情况下,锚定标记中有一个P标记。如果使用Jsoup解析,它会添加一个额外的</a>;标记和<;a>;在接近#item1之间添加标记,更改html结构

public class Test{
        public static void main(String[] args) {

            String html="<A HREF=\"#Item1\">\n"
                    + "<p style=\"font-family:times;margin-top:12pt;margin-left:0pt;\">\n"
                    + "<FONT SIZE=2>Item&nbsp;1.</FONT>\n"
                    + "</A>";
            Document doc = Jsoup.parse(html);
            System.out.println("UNPARSED = \n"+html);
            System.out.println("JSOUP PARSED = \n"+doc.toString());

        }
}

输出

        UNPARSED = 
        <A HREF="#Item1">
        <p style="font-family:times;margin-top:12pt;margin-left:0pt;">
        <FONT SIZE=2>Item&nbsp;1.</FONT>
        </A>
        JSOUP PARSED = 
        <html>
         <head></head>
         <body>
          <a href="#Item1"> </a>
          <p style="font-family:times;margin-top:12pt;margin-left:0pt;"><a> <font size="2">Item&nbsp;1.</font> </a></p>
         </body>
        </html>

是否有任何方法可以避免使用Jsoup自动完成标记。 多谢各位


共 (1) 个答案

  1. # 1 楼答案

    更新

    如图How to prevent tags replacement?

    这个问题有一个很好的解决方案:

    解析时使用:

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

    将提供:

    <a href="#Item1"> <p style="font-family:times;margin-top:12pt;margin-left:0pt;"> <font size="2">Item&nbsp;1.</font> </p></a>
    

    谢谢@user2784201

    旧的回应:

    我不确定你所要求的是可能的还是不可能的,但我认为这违背了JSoup的理念,即以尽可能类似于浏览器的方式解析html

    请注意,浏览器也会关闭该标记。我认为这是因为在HTML4中,在a中加入P是被禁止的。看看这个https://stackoverflow.com/a/1828032/3324704

    顺便说一句,我认为您使用的是旧版本的JSoup,如果您使用1.8.1,您将看到内部的A标记(JSoup放在那里的伪标记,也是由浏览器放的)将覆盖href。这一事实可能会帮助你进行语法分析。参见JSOUP1.8.1的输出(注意内部<a href="#Item1">):

    JSOUP PARSED = 
    <!DOCTYPE html>
    <html>
     <head></head>
     <body>
      <a href="#Item1"> </a>
      <p style="font-family:times;margin-top:12pt;margin-left:0pt;"><a href="#Item1"> <font size="2">Item&nbsp;1.</font> </a></p>
     </body>
    </html>
    

    此外,我还尝试了其他库。Htmlcleaner(here)触发一个错误(a-UnpermittedChild),并给出非常类似的输出:

    <?xml version="1.0" encoding="UTF-8"?>
    <html>
    <head></head>
    <body><a href="#Item1">
    </a><p style="font-family:times;margin-top:12pt;margin-left:0pt;"><a href="#Item1">
    <font size="2">Item 1.</font>
    </a></p></body></html>
    

    和jtidy(here)说:

    Warning: missing </a> before <p>
    

    并给出:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta name="generator"
    content="HTML Tidy for Java (vers. 2009-12-01), see jtidy.sourceforge.net" />
    <title></title>
    </head>
    <body>
    <a href="#Item1"></a>
    <p style="font-family:times;margin-top:12pt;margin-left:0pt;"><font
    size="2">Item&nbsp;1.</font> </p>
    </body>
    </html>
    

    也许你可以使用一个普通的XML解析器

    抱歉,我的回答冗长且不令人满意:(