【问题标题】:JSoup parsing invalid HTML with unclosed tagsJSoup 解析带有未闭合标签的无效 HTML
【发布时间】: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 我没有找到任何东西。

【问题讨论】:

    标签: java html-parsing web-crawler jsoup


    【解决方案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 的可重复结果,您应该严格使用同一解析器的相同版本。

        猜你喜欢
        • 2013-11-14
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多