Как я могу извлечь определенные ссылки в статьях Википедии с помощью jsoup?

Я выполняю проект НЛП, и мне нужно знать, как извлекать ссылки, которые находятся только в разделе «Введение» и в разделе «География» на этой странице википедии: http://en.wikipedia.org/wiki/Бостон

Не могли бы вы мне помочь?


person Ema    schedule 06.02.2012    source источник
comment
Дубликат stackoverflow.com/questions/9151075/   -  person beerbajay    schedule 06.02.2012
comment
Не ответ на ваш вопрос, но, возможно, вам будет проще использовать Загрузки Викимедиа базу данных резервные копии дампов   -  person Tomasz Nurkiewicz    schedule 06.02.2012
comment
Что вы пробовали? Похоже, вам придется перебирать элементы, пока не найдете еще один <h3>, указывающий на заголовок раздела.   -  person Dave Newton    schedule 06.02.2012
comment
@beerbajay Несмотря на то, что это связано, это явно не дубликат, поскольку здесь речь идет конкретно об отдельных элементах.   -  person Dave Newton    schedule 06.02.2012
comment
@beerbajay Это НЕ дубликат! Я хотел бы знать, как я могу использовать метод select() для извлечения ссылок из определенного раздела статьи в Википедии.   -  person Ema    schedule 06.02.2012


Ответы (1)


Википедия не упрощает эту задачу. Я не утверждаю, что это элегантно или даже многоразово.

    Document doc = Jsoup.connect("http://en.wikipedia.org/wiki/Boston").timeout(5000).get();

    Element intro = doc.body().select("p").first();
    while (intro.tagName().equals("p")) {
        //here you will get an Elements object which you can
        //iterate through to get the links in the intro
        System.out.println(intro.select("a"));
        intro = intro.nextElementSibling();
    }

    for (Element h2 : doc.body().select("h2")) {
        if(h2.select("span").size() == 2) {
            if (h2.select("span").get(1).text().equals("Geography")) {
                Element nextsib = h2.nextElementSibling();
                while (nextsib != null) {
                    if (nextsib.tagName().equals("p")) {
                        //here you will get an Elements object which you
                        //can iterate through to get the links in the 
                        //geography section
                        System.out.println(nextsib.select("a"));
                        nextsib = nextsib.nextElementSibling();
                    } else if (nextsib.tagName().equals("h2")) {
                        nextsib = null;
                    } else {
                        nextsib = nextsib.nextElementSibling();
                    }
                }
            }
        }
    }
}
person B. Anderson    schedule 07.02.2012
comment
Спасибо !!! Я попробовал ваш код, и для раздела введения работает нормально ... Я не могу сказать то же самое для раздела географии: некоторые ссылки пропущены, а некоторые из раздела климата! Но в любом случае это хороший шаг! Большое спасибо, пожалуйста, дайте мне знать, если вы нашли решение! Я сделаю то же самое! :) - person Ema; 07.02.2012
comment
Я переместил строку nextsib = nextsib.nextElementSibling(); ниже System.out.println(nextsib.select(a)); Это должно исправить это. - person B. Anderson; 07.02.2012
comment
ммм... я думаю, это то же самое!!! Теперь я понимаю, что упущено!! Ссылки размещены в начале раздела География (первый абзац Географии). - person Ema; 07.02.2012
comment
Эй, извините, первая версия работает!!! Это была моя ошибка... Теперь я проверяю другую страницу из Википедии! - person Ema; 07.02.2012
comment
Итак... я видел, что ваш код работает с некоторыми статьями, такими как Бостон, Массачусетс, Новая Англия, но не с Лондоном! попробую понять почему! :) Спасибо еще раз - person Ema; 07.02.2012
comment
Это будет работать только в том случае, если статьи выложены одинаково. В Википедии такое сканирование экрана довольно сложно, потому что они не разбивают разделы на части и используют идентификаторы и классы для элементов, что значительно упростило бы использование выбора. Кроме того, статьи не обязательно должны следовать одному и тому же формату, поэтому любое отклонение нарушит код. - person B. Anderson; 07.02.2012
comment
В частности, в случае с Лондоном первый тег ‹p› указывает на почтовые индексы. Это больше похоже на третий или четвертый тег ‹p›, содержащий вступление. Кроме того, теги ‹h2› содержат только один тег ‹span›, в то время как бостонская статья содержит два тега ‹span›. Странный. - person B. Anderson; 07.02.2012
comment
Вставка этой строки: Element intro = doc.select(table.infobox + p).first(); вместо этого: Element intro = doc.body().select(p).first(); сделал трюк! :D Спасибо большое в любом случае :) - person Ema; 07.02.2012