【问题标题】:Htmlunit Skipping Page With Button Click带有按钮单击的Htmlunit跳过页面
【发布时间】:2013-10-28 20:48:34
【问题描述】:

我有一个用 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(),第一页上的信息仅返回 3 次。另外,s 指的是网站的字符串。

【问题讨论】:

    标签: java javascript jquery html htmlunit


    【解决方案1】:

    如果不查看您尝试获取的页面,您的代码中有些东西实际上闻起来很奇怪。

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

    这些只是一些可以帮助您的通用 cmets。他们不一定会解决问题,但应该会大大改进您的代码。

    【讨论】:

    • 有些人需要刷新,有些人不需要。我相信网站出了点问题,导致每次迭代都需要不同的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2016-03-08
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2014-09-10
    • 2013-05-12
    相关资源
    最近更新 更多