解析网站html代码:htmlunit.javascript.StrictErrorReporter runtimeError

时间:2017-11-04 19:15:26

标签: java web-scraping htmlunit

在这段代码中,我试图解析url给出的网站的html代码。

我最初尝试使用jsoup.connect.get但是在文档中加载的html代码并不是我在浏览器中看到的。然后我开始使用htmlunit基于net中给出的反馈,jsoup将无法完全检索基于javascript / ajax的页面的html代码。当我使用htmlunit包及其WebClient类时,我遇到以下错误:

  

2017年11月5日上午12:40:15 com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter runtimeError   SEVERE:runtimeError:message = [超出最大堆栈深度] sourceName = [{3}}中的脚本(8,9)到(26,10)] line = [22] lineSource = [null] lineOffset = [0]   2017年11月5日12:40:15 com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify   警告:遇到过时的内容类型:'text / javascript'。   2017年11月5日上午12:40:15 com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter runtimeError   SEVERE:runtimeError:message = [超出最大堆栈深度] sourceName = [http://www.dspblackrock.com/about-us/mandatory-disclosure/month-end-portfolio-disclosures line = [70] lineSource = [null] lineOffset = [0]

是java的新手。首先是使用htmlUnit正确解决手头的问题?如果是这样,如何解决上述错误?

import java.io.*;
import java.net.*;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.parser.Parser;
import org.jsoup.nodes.Document;
import org.apache.commons.validator.routines.UrlValidator;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class URLToFile {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Hello World!");
      String url;

      UrlValidator urlValidator = new UrlValidator();
      try {

         url = "http://www.dspblackrock.com/about-us/mandatory-disclosure/month-end-portfolio-disclosures";
         WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52);
         webClient.getOptions().setJavaScriptEnabled(true);
         webClient.getOptions().setThrowExceptionOnScriptError(false);
         webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
         HtmlPage myPage = webClient.getPage(url);
         webClient.close();
         Document doc = Jsoup.parse(myPage.asXml());
         System.out.println(doc);
      }  catch (MalformedURLException mue) {

             System.out.println("Ouch - a MalformedURLException happened.");
             mue.printStackTrace();
             System.exit(1);

          } catch (IOException ioe) {

             System.out.println("Oops- an IOException happened.");
             ioe.printStackTrace();
             System.exit(1);

          } finally {
              System.out.println("Entered finally");
          } // end of 'finally' clause
    }
}

1 个答案:

答案 0 :(得分:0)

请确保您使用的是HtmlUnit的最新SNAPSHOT版本。使用此版本进行了简短的测试,页面正常运行。

否则

Document doc = Jsoup.parse(myPage.asXml());
从我的角度来看,

是一个坏主意。

  1. HtmlUnit是自己的模型。您可以使用HtmlUnit API完成使用Jsoup所能完成的所有工作。
  2. 您可能会根据您所做的转换(HtmlUnit DOM - > XML - > Jsoup DOM)丢失一些信息
  3. 如果您使用HtmlUnit API(和模型),您仍然可以获得javascript支持(例如,如果您点击按钮,则会触发所有事件。)
  4. 经过一些分析后,我在页面中找到了这个(最小化/混淆)源代码:

    iL(/\x3c/.test(function() {
        return "\x3c"
    }) & !/x3d/.test(function() {
        return "'x3'+'d';"
    }));
    

    详细了解此here

    看起来页面背后的人正试图检测犀牛。我担心使用HtmlUnit使这个页面可用是一项艰苦的工作。