如何在Jsoup中关闭自动生成关闭标签?

时间:2014-11-20 13:17:56

标签: java html-parsing jsoup

我试图解析HTML文档,我遇到了以下场景。我已在以下代码中以字符串的形式放置内容。在此,锚标签内部有一个P标签。如果用Jsoup解析,它会增加一个额外的< / 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 个答案:

答案 0 :(得分: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的理念不同,它的方式与浏览器的方式尽可能相似。

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

Bytheway我认为你使用的是旧版本的JSoup,如果使用1.8.1,你会看到内部A标签(由JSoup放置的虚假标签,也是浏览器)将保留href。这个事实可以帮助您解析。请参阅JSoup 1.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解析器......

对于详细程度和不满意的回复表示抱歉:(