JSoup 解析带有未闭合标签的无效 HTML

Posted

技术标签:

【中文标题】JSoup 解析带有未闭合标签的无效 HTML【英文标题】:JSoup parsing invalid HTML with unclosed tags 【发布时间】:2013-03-26 16:21:35 【问题描述】:

使用 JSoup (包括最新版本 1.7.2)在解析 invalid html with unclosed tags 时存在错误。

例子:

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 我没有找到任何东西。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案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>

【讨论】:

【参考方案3】:

您的 HTML 无效

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

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

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

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

”或“

”)放入内联元素(例如“”、“ " 或 "")。

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

【讨论】:

我知道 HTML 是无效的,因为有未封闭的标签

但是浏览器以与 JSoup 解析器不同的方式解决未封闭的标签。所以我觉得应该和浏览器一样解决未闭合标签吧?

没有修复损坏的 HTML 的标准方法。即使是不同的浏览器也会以不同的方式解释无效的 HTML。见webdesign.about.com/od/beginningtutorials/f/invalid_html_ok.htm 我认为有 2 种方法或给出与所有新浏览器目前所做的相同的响应或抛出错误。因此,JSoup 应该做其中之一,而不是介于两者之间。

以上是关于JSoup 解析带有未闭合标签的无效 HTML的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在 Jsoup 解析中环绕 html 头标签

JSoup 解析垃圾 Freemarker 标签

jsoup怎么解析javascript动态改变html标签的属性值

使用 Google Refine/OpenRefine & Jsoup/BeautifulSoup 解析和删除 HTML 标签

使用Jsoup解析HTML页面

如何使用 Jsoup 添加新的 html 标签?