Невозможно получить элемент с идентификатором из URL, используя HtmlUnit в Java - PullRequest
0 голосов
/ 06 февраля 2019

Невозможно получить элемент с id="parcelMailingAddressResult" из https://www.mohavecounty.us/ContentPage.aspx?id=111&cid=869&parcel=10272001, используя HTMLUnit в Java

Если вы перейдете по указанному выше URL-адресу, вы увидите, что существует почтовый адрес.Проверка сайта DOM показывает, что адрес имеет вышеуказанный идентификатор.В течение нескольких дней я пытался получить этот почтовый адрес, используя мой Java / HTMLUnit, и ни одна из моих попыток не сработала.

Ниже приведены три метода, которые я пробовал в одном и том же коде.

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) на get(<someHigherInteger>), также будет содержать информацию об адресе владельца.

Вместо:

  1. ownerAddresses = null (после выполнения ownerAddress = ...)
  2. узлов имеет размер 0 (после выполнения узлов = ...)
  3. final HtmlDivision div = (HtmlDivision) page.getByXPath("//div[@class='container-fluid row']").get(0); примерно через 13 секунд выдает следующее исключение:

Исключение:
java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0.

, что означает, что (HtmlDivision) page.getByXPath("//div[@class='container-fluid row']") имеет длину0.

1 Ответ

0 голосов
/ 11 февраля 2019

Технически проблема решена .Вот новый код:

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 минут.Но это другой вопрос, который я задам отдельным вопросом в Stack Overflow.

...