使用Java中的HtmlUnit无法从URL获取ID为ID的元素

时间:2019-02-06 07:18:16

标签: java htmlunit

无法使用id="parcelMailingAddressResult"中的https://www.mohavecounty.us/ContentPage.aspx?id=111&cid=869&parcel=10272001HTMLUnit的{​​{1}}元素中获取元素

如果转到上面的URL,则会看到有一个通讯地址。网站的DOM检查显示该地址具有上述ID。我已经尝试了好几天使用Java / HTMLUnit来获取该邮件地址,但我的尝试均无济于事。

下面是我在同一代码中尝试过的三种方法。

Java

我希望变量System.getProperties().put("org.apache.commons.logging.simplelog.defaultlog", "fatal"); final WebClient webClient = new WebClient(); webClient.getOptions().setCssEnabled(false); webClient.getOptions().setJavaScriptEnabled(false); webClient.getOptions().setThrowExceptionOnScriptError(false); webClient.setRefreshHandler(new RefreshHandler() { public void handleRefresh(Page page, URL url, int arg) throws IOException { System.out.println("handleRefresh"); } }); HtmlPage page = (HtmlPage) webClient.getPage("https://www.mohavecounty.us/ContentPage.aspx?id=111&cid=869&parcel=10272001"); DomElement ownerAddresses = page.getElementById("parcelMailingAddressResult"); NodeList nodes = page.getElementsByTagName("parcelMailingAddressResult"); final HtmlDivision div = (HtmlDivision) page.getByXPath("//div[@class='container-fluid row']").get(0); 和节点包含包含所有者地址的信息。我希望ownderAddresses包含一些其他信息,并且一旦我将div更改为get(0),还将包含有关所有者地址的信息。

相反:

  1. get(<someHigherInteger>)(执行ownerAddress = ...之后)
  2. 节点的大小为0(执行节点后= ...)
  3. ownerAddresses = null 大约13秒后,引发以下异常:

例外:
final HtmlDivision div = (HtmlDivision) page.getByXPath("//div[@class='container-fluid row']").get(0);

这意味着java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0的长度为0。

1 个答案:

答案 0 :(得分:0)

技术上已解决的问题。这是新代码:

System.getProperties().put("org.apache.commons.logging.simplelog.defaultlog", "fatal");
final WebClient webClient = new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.setRefreshHandler(new RefreshHandler() {
    public void handleRefresh(Page page, URL url, int arg) throws IOException {
        System.out.println("handleRefresh");
}
});
HtmlPage page = (HtmlPage) webClient.getPage("https://www.mohavecounty.us/ContentPage.aspx?id=111&cid=869&parcel=10272001"); 
HtmlElement ownerAddressElement = (HtmlElement) page.getElementById("parcelMailingAddressResult");
String ownerAddress = ownerAddressElement.asText();

我说“技术上”,因为上面的代码在我的虚拟机上花费了大约一个小时才能获得ownerAddress。实际上,这使我的代码很难使用。我怀疑以下情况:当您转到https://www.mohavecounty.us/ContentPage.aspx?id=111&cid=869&parcel=10272001时,仅需几秒钟即可加载页面。但是即使经过一个半小时,蓝色的“搜索”按钮仍显示忙音。我怀疑页面的JavaScript进入了一个无限循环,这使webClient认为页面仍在加载,直到一个小时后失去耐心为止。

我希望将时间从一个小时减少到30分钟以内。但这是另一个问题,我将在堆栈溢出中作为一个单独的问题提出。