HtmlUnit, чтобы щелкнуть конкретную ссылку из ссылки с тем же именем

Я начал использовать HtmlUnit сегодня, поэтому в то время я был немного нубом.

Мне удалось зайти на IMDB и найти фильм "Спящие" 1996 года, и я получил кучу результатов с тем же названием:

Вот результаты этого поиска

Я хочу выбрать из списка первых «спящих», что является правильным, но я не знаю, как получить эту информацию с помощью HtmlUnit. Я заглянул внутрь кода и нашел ссылку, но не знаю, как ее извлечь.

Думаю, я мог бы использовать какое-нибудь регулярное выражение, но это помешало бы использованию HtmlUnit.

Это мой код (в нем есть некоторые биты из учебника HtmlUnit и некоторый код, найденный здесь):

public IMdB() {
    try {
        //final WebClient webClient = new WebClient();

        final WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_8, "10.255.10.34", 8080);

        //set proxy username and password 
        final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
        credentialsProvider.addCredentials("xxxx", "xxxx");

        // Get the first page
        final HtmlPage page1 = webClient.getPage("http://www.imdb.com");

        // Get the form that we are dealing with and within that form, 
        // find the submit button and the field that we want to change.
        //final HtmlForm form = page1.getFormByName("navbar-form");
        HtmlForm form = page1.getFirstByXPath("//form[@id='navbar-form']");

        //
        HtmlButton button = form.getFirstByXPath("/html/body//form//button[@id='navbar-submit-button']");            
        HtmlTextInput textField = form.getFirstByXPath("/html/body//form//input[@id='navbar-query']");

        // Change the value of the text field
        textField.setValueAttribute("Sleepers");

        // Now submit the form by clicking the button and get back the second page.
        HtmlPage page2 = button.click();

       // form = page2.getElementByName("s");

        //page2 = page2.getFirstByXPath("/html/body//form//div//tr[@href]");

        System.out.println("content: " + page2.asText());

        webClient.closeAllWindows();
    } catch (IOException ex) {
        Logger.getLogger(IMdB.class.getName()).log(Level.SEVERE, null, ex);
    }

    System.out.println("END");
}

person Jh62    schedule 27.08.2013    source источник
comment
Вы смогли воспользоваться предложением?   -  person dirtydexter    schedule 27.08.2013
comment
нет, потому что это было не то, что я искал, но все равно спасибо. Наконец-то я использовал некоторое регулярное выражение для извлечения некоторых конкретных данных.   -  person Jh62    schedule 03.09.2013


Ответы (2)


Вы должны сделать это следующим образом:

HtmlPage htmlPage = new WebClient().getPage("http://imdb.com/blah");
HtmlAnchor anchor = htmlPage.getFirstByXPath("//td[@class='primary_photo']//a")
System.out.println(anchor.getHrefAttribute());
person Mosty Mostacho    schedule 27.08.2013
comment
Спасибо. Я попробую это. Мне удалось извлечь некоторые конкретные данные с помощью регулярных выражений, но я думаю, что у HtmlUnit есть некоторые инструменты для этого типа вещей. - person Jh62; 03.09.2013
comment
Как бы я извлек часть Sleepers из этого: <td class="title"> <span class="wlb_wrapper" data-tconst="tt0117665" data-size="small" data-caller-name="search"></span> <a href="/title/tt0117665/">Sleepers</a> <span class="year_type">(1996)</span><br> <div class="user_rating">? Моя программа работает нормально. Он находит фильм, актерский состав, номинации, рейтинг и т. д., но через регулярное выражение. - person Jh62; 03.09.2013
comment
Regex явно НЕ подходит. Проверьте этот вопрос и первый ответ. Я бы рекомендовал вам использовать XPath. Вы найдете много руководств в Google. - person Mosty Mostacho; 03.09.2013
comment
Спасибо, я посмотрю на это, но я думаю, что регулярное выражение (хотя это и не лучший способ сделать это) хорошо работает для простых вещей. Моя программа уже работает и извлекает информацию с помощью регулярных выражений (пока я не научусь использовать xpath9). - person Jh62; 06.09.2013

Я бы посоветовал вам использовать IMDB api, а не делать все это

IMDb в настоящее время имеет два общедоступных API, которые, хотя и недокументированы, очень быстрые и надежные (используются на их собственном сайте через AJAX).

  1. Статически кэшированный API поисковых предложений:

  2. Расширенный поиск

person dirtydexter    schedule 27.08.2013
comment
Я думаю, что его намерение состоит в том, чтобы научиться использовать HtmlUnit, а не извлекать данные из IMDB. - person Mosty Mostacho; 28.08.2013
comment
@MostyMostacho хорошо, может быть, я сделал другой вывод. - person dirtydexter; 28.08.2013
comment
Да, это была идея, но все равно спасибо. Приятно знать об этом. - person Jh62; 03.09.2013