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怎么解析javascript动态改变html标签的属性值
使用 Google Refine/OpenRefine & Jsoup/BeautifulSoup 解析和删除 HTML 标签