9

使用 JSoup 包括最后一个版本 1.7.2 存在一个错误,解析带有未闭合标签的无效HTML 。

例子:

String tmp = "<a href='www.google.com'>Link<p>Error link</a>";
Jsoup.parse(tmp);

生成的文档是:

<html>
 <head></head>
 <body>
  <a href="www.google.com">Link</a>
  <p><a>Error link</a></p>
 </body>
</html>

浏览器会生成如下内容:

<html>
 <head></head>
 <body>
  <a href="www.google.com">Link</a>
  <p><a href="www.google.com">Error link</a></p>
 </body>
</html>

Jsoup 应该用作浏览器或源代码。

有什么解决办法吗?查看API我没有找到任何东西。

4

3 回答 3

6

正确的行为是在解析这个无效的 HTML 时充当其他浏览器。感谢您提交此错误。我已经解决了阻止收养机构将原始属性保留在新节点中的问题。它将在 1.7.3 中可用,或者您现在可以从头构建。

于 2013-10-06T23:23:00.037 回答
2

如果您的目标是获取浏览器生成的源代码,则可以使用 selenium,然后将其传递给 Jsoup 进行解析。但是 selenium 应该打开一个真正的浏览器,当然它可以自动打开它。像这样的代码:

public static void main(String[] args) {

    //System.setProperty("webdriver.chrome.driver", "./chromedriver.exe");
    //WebDriver driver = new ChromeDriver();
    WebDriver driver = new FirefoxDriver();
    driver.get("file:///C:/Users/jgong/Desktop/a.html");

    String html = driver.getPageSource();
    System.out.println(html);
    driver.quit();
    Document doc = Jsoup.parse(html);
    System.out.println(doc.html());

}

a.html 是:

<html><head></head><body><a href="www.google.com">Link<p>Error link</a></body></html>

结果是你想要的:

<html><head></head> <body> <a href="www.google.com">Link</a><p><ahref="www.google.com">Error link</a> </p></body></html>
于 2013-09-12T02:27:53.400 回答
-1

您的 HTML 无效

文档类型在此处不允许元素“P”;缺少“APPLET”、“OBJECT”、“MAP”、“IFRAME”、“BUTTON”开始标签之一

<a href='www.google.com'>Link<p>Error link</a>

所提到的元素不允许出现在您放置它的上下文中;其他提到的元素是唯一允许在那里并且可以包含提到的元素的元素。这可能意味着您需要一个包含元素,或者您可能忘记关闭前一个元素。

此消息的一个可能原因是您试图将块级元素(例如“<p>”或“<table>”)放入内联元素(例如“<a>”、“<span> ",或 "<font>")。

没有修复损坏的 HTML 的标准方法,每个不同的解析器都会尽力而为。如果您想要无效 HTML 的可重复结果,您应该严格使用同一解析器的相同版本。

于 2013-04-10T16:14:37.293 回答