htmlunit Java - Как проанализировать содержимое результатов из JavaScript? и ошибка htmlunit - PullRequest
1 голос
/ 17 мая 2019

Это одна страница, которую я собираюсь почистить: https://www.tokopedia.com/berkahcell2/promo-termurah-vr-virtual-reality-box-v-2-0-remote-bluetooth-gamepad/review?src=topads

Я хочу просмотреть текст комментария в разделе "ulasan terbaru", который, как я теоретизирую, является результатом javascript (хотя я могу ошибаться, но я не совсем уверен, как проверить его с помощью элемента inspect), кроме этого Я также не уверен в некоторых вещах в HTMLUnit

Я прочитал, что для удаления содержимого javascript мне нужно использовать HTMLUnit, а не Jsoup. Я прочитал http://htmlunit.10904.n7.nabble.com/Selecting-a-div-by-class-name-td25787.html, чтобы попытаться отменить комментарий div по классу, но я получил нулевой вывод.

    public static void comment(String url) throws IOException{

        WebClient client = new WebClient();
        client.setCssEnabled(true);
        client.setJavaScriptEnabled(true);

        try {
            HtmlPage page = client.getPage(url);
            List<?> date = page.getByXPath("//div/@class='list-box-comment'");
            System.out.println(date.size());
            for(int i =0 ; i<date.size();i++){
                System.out.println(date.get(i).asText());
            }
        }
        catch(Exception e){
                e.printStackTrace();
            }

    }

Это часть моего кода, которая будет обрабатывать комментарии, правильно ли я делаю? Но у меня есть две проблемы:

  1. в asText () он сказал, что «не может разрешить метод asText ()»
  2. Даже если я запускаю без «asText ()», я получаю это как ошибку:
com.gargoylesoftware.htmlunit.ObjectInstantiationException: unable to create HTML parser
    at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.<init>(HTMLParser.java:418)
    at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.<init>(HTMLParser.java:342)
    at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:203)
    at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:179)
    at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:221)
    at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:106)
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:433)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:311)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358)
    at ReviewScrapping.comment(ReviewScrapping.java:86)
    at ReviewScrapping.main(ReviewScrapping.java:108)
Caused by: org.xml.sax.SAXNotRecognizedException: Feature 'http://cyberneko.org/html/features/scanner/allow-selfclosing-iframe' is not recognized.
    at org.apache.xerces.parsers.AbstractSAXParser.setFeature(Unknown Source)
    at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.<init>(HTMLParser.java:411)
    ... 11 more

Я надеюсь, что смогу показать все комментарии

/ edit Я использую Intellij в качестве своей IDE, когда я делаю это, и зависимости для HTMLUnit находятся в моей структуре проекта Intellij с использованием Maven

1 Ответ

0 голосов
/ 19 мая 2019

Относительно вашего кода:

public static void main(String[] args) throws IOException {
    final String url = "https://www.tokopedia.com/berkahcell2/promo-termurah-vr-virtual-reality-box-v-2-0-remote-bluetooth-gamepad/review?src=topads";

    try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {
        webClient.getOptions().setThrowExceptionOnScriptError(false);

        HtmlPage page = webClient.getPage(url);
        webClient.waitForBackgroundJavaScript(40_000);

        System.out.println(page.asXml());

        List<DomNode> date = page.getByXPath("//div[@class='list-box-comment']");
        System.out.println(date.size());

        for(int i = 0 ; i < date.size();i++){
            System.out.println(date.get(i).asText());
        }
    }
}

Теперь проблемы с самой страницей:

Провели некоторый тест, и похоже, что страница выдает ошибки и в реальных браузерах (проверьте консоль браузера). Но с HtmlUnit вы получаете больше проблем (возможно, из-за отсутствия поддержки некоторых функций javascript). Обычно на страницах такого типа используется много-много строк js-кода - мне действительно потребуется много времени, чтобы понять, что происходит не так. Если вы хотите исправить это, попробуйте найти реальную причину проблемы (см. http://htmlunit.sourceforge.net/submittingJSBugs.html для некоторых подсказок) и отправьте отчет об ошибке.

...