繁体   English   中英

带有按钮的HTMLunit跳过页面

[英]Htmlunit Skipping Page With Button Click

我有一个用Htmlunit编写的程序,可以从网站上的多个页面返回信息。 问题是,尽管前两页返回正常,但随后每隔一页返回一次(返回第1、2、4、6等页)。 我相信我引用的所有变量都是正确的,因此我不确定是服务器与程序通信还是其他问题。 我的代码是:

  public static void scrapeWebsite() throws IOException {

    final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage(s);
    originalHtml = page.getWebResponse().getContentAsString();
    obtainInformation();
    originalHtml = "";

    //////code below returns page 2 as expected////

    final HtmlForm form = page.getForms().get(0);
    final HtmlSubmitInput button = form.getInputByValue(">");
    final HtmlPage page2 = button.click();
    try {
      synchronized (page2) {
        page2.wait(5000);
      }
    }
    catch(InterruptedException e)
    {
      System.out.println("error");
    }
    originalHtml = originalHtml + page2.refresh().getWebResponse().getContentAsString();
    obtainInformation();
    originalHtml = "";


    /////// code below returns page 4, instead of page 3/////

    final HtmlForm form2 = page2.getForms().get(0);
    final HtmlSubmitInput button2 = form2.getInputByValue(">");
    final HtmlPage page3 = button2.click();
    try {
      synchronized (page3) {
        page3.wait(5000);
      }
    }
    catch(InterruptedException e)
    {
      System.out.println("error");
    }
    originalHtml = originalHtml + page3.refresh().getWebResponse().getContentAsString();
    obtainInformation();
}

我能想到的唯一问题是,当运行page.refresh()时,它实际上是双击按钮,但是如果没有page.refresh(),则第1页上的信息仅返回3次。 此外,s表示网站的字符串。

在不看您要获取的页面的情况下,有些事情实际上在代码中听起来很奇怪。

  1. 您有复制/粘贴的代码。 那是不正确的,导致难以遵循的代码并且非常容易出错。 确保对代码进行模块化,这样就不必在每个页面上都重复它。
  2. 目前尚不清楚您正在使用originalHtml变量进行操作。 看来这只是您在该方法中编写的静态变量。 您似乎没有在那里读它,因此您可能是在obtainInformation()方法中阅读它,在这种情况下,应仅在该方法中使用它。 更不用说您要为其分配值"" ,然后再分配页面值,从而无需分配""
  3. 我没有任何理由对HtmlUnit返回的原始HTML进行操作,而不是对其XML表示进行操作。 您应该将page.getWebResponse().getContentAsString()替换为page.asXml() 当然,如果您确实需要将页面的原始HTML保存到文件中,请保持原样。
  4. 我看不到有任何理由在那里执行refresh() 您得到page2并等待5秒钟(盲目地假定该页面作为新内容已准备好在其上进行操作)。 然后,无需刷新page2 ,而是刷新它并获取新页面的内容。 这可能是导致您正确获得第一页,其余页以2隔开的原因。

这些只是一些一般性的评论,应该会对您有所帮助。 他们不一定能解决问题,但应该可以大大改善您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM