Проблема с парсингом через HtmlUnit java

117
13 февраля 2021, 12:50

Задача состоит в том, чтобы передать страничке элементы и получить назад вернувшиеся данные. Для я пробовал использовать Jsoup, а затем HtmlUnit. Проблема заключается в том, что с помощью и той и другой библиотеки, получается вернуть чистый HTML-код в котором отсутствуют некоторые элементы.

Результат работы кода:

HtmlDivision[<div id="mod_dlg_0" class="hide information pnl-info">]

То что должен видеть (аттрибут display):

Идея заключалась в том, чтобы передать методом POST данные, и проверить изменилось ли значение display с none на block. Реализация:

WebClient webClient = new WebClient();
        webClient.getOptions().setCssEnabled(true);

        WebRequest requestSettings = new WebRequest(new URL(
                "http://npchk.nalog.ru/index.html"), HttpMethod.POST);
        requestSettings.setRequestParameters(new ArrayList());
        requestSettings.getRequestParameters().add(new NameValuePair("inn", "7731347089"));
        requestSettings.getRequestParameters().add(new NameValuePair("kpp", "773101001"));
        HtmlPage page = webClient.getPage(requestSettings);
        webClient.waitForBackgroundJavaScript(30 * 1000);
        HtmlDivision div = page.getHtmlElementById("mod_dlg_0");
        System.out.println(page.asXml());
        System.out.println(div.toString());

1) Есть ли какой-то метод, которые поможет решить эту проблему?

2) Может стоить попробовать использовать какие-то другие библиотеки?

3) Возможно Вы знаете какие-то более простые решения задачи? Адрес HTML страницы: http://npchk.nalog.ru/index.html

Answer 1

Смог решить вопрос с помощью silenium библиотеки. К сожалению работает она не всегда быстро и скачивание файлов не смог осуществить через PhantomDriver, только через ChromeDriver, который работает только открывая окно браузера Chrome.

    WebDriver webDriver = new PhantomJSDriver(caps);
    webDriver.get("http://npchk.nalog.ru/index.html");
    inn = contractor.getInn();
    kpp = contractor.getKpp();
    date = contractor.getDt();
    StringSelection selection = new StringSelection(inn);
    StringSelection selectionkpp = new StringSelection(kpp);
    StringSelection selectiondate = new StringSelection(date);
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents(selection, selection);
    webDriver.findElement(By.id("inn")).sendKeys(Keys.CONTROL + "v");
    if (!(kpp.equals("000000000"))) {
        clipboard.setContents(selectionkpp, selectionkpp);
        webDriver.findElement(By.id("kpp")).sendKeys(Keys.CONTROL + "v");
    }
    clipboard.setContents(selectiondate, selectiondate);
    webDriver.findElement(By.id("dt")).sendKeys(Keys.CONTROL + "v");
    webDriver.findElement(By.xpath("//*[@id=\"content\"]/form/div[4]/div/div[10]/button")).click();
    WebDriverWait wait = new WebDriverWait(webDriver, 5);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"content\"]/form/div[3]")));
    Thread.sleep(1000);

В данном случае он возвращает элемент страницы после выполнения скриптов, полностью имитируя браузер.

READ ALSO
org.hibernate.exception.GenericJDBCException: Could not open connection

org.hibernate.exception.GenericJDBCException: Could not open connection

Решил изучить один проектТам вот такое обращение к БД(MySQL) и конфиг

109
Обработка List&lt;&gt; через Stream API

Обработка List<> через Stream API

Имеется класс, в котором есть поле Path directory; и метод, который возвращает список объектов - List getAllStorted

186
Потокобезопасный ArrayList

Потокобезопасный ArrayList

Пишу свою реализацию потокобезопасного эррэй листа на CAS-блокировках (не спрашивайте зачем)Столкнулся с некоторым непонятным мне поведением...

136
Несколько яндекс карт в цикле с кнопками. Не работают кнопки

Несколько яндекс карт в цикле с кнопками. Не работают кнопки

Есть такая проблемкаВыводится какое-то кол-во яндекс карт, сейчас 3, в цикле

99