JSoup使用未关闭的标记解析无效的HTML

使用JSoup包含最后一个版本1.7.2,有一个错误解析带有未关闭标记的 无效 HTML。

例:

String tmp = "Link

Error link"; Jsoup.parse(tmp);

生成的文档是:

    Link 

Error link

浏览器会生成以下内容:

    Link 

Error link

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

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

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

如果您的目标是获取浏览器生成的源代码,则可以使用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是:

 Link

Error link

结果就是你想要的:

   Link

Error link

您的HTML无效

文档类型不允许元素“P”; 缺少“APPLET”,“OBJECT”,“MAP”,“IFRAME”,“BUTTON”开始标记之一

 Link

Error link

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

此消息的一个可能原因是您尝试将块级元素(例如“

”或“

”)放在内联元素中(例如“”,“ “,或”“)。

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