Как мне разобрать HTML-документ с помощью JSoup, чтобы получить список ссылок? - PullRequest
4 голосов
/ 19 августа 2011

Я пытаюсь разобрать http://www.craigslist.org/about/sites, чтобы создать набор текста / ссылок для динамической загрузки программы с этой информацией. Пока я сделал это:

Document doc = Jsoup.connect("http://www.craigslist.org/about/sites").get();
Elements elms = doc.select("div.colmask"); // gets 7 countries

Ниже этого тега есть теги doc.select("div.state_delimiter,ul"), которые я пытаюсь получить. Я настраиваю свой итератор и захожу некоторое время, смотрю и вызываю iterator.next().outerHtml();. Я вижу все теги для каждой страны.

Как я могу пройти через каждый div.state_delimiter, потяните этот текст, затем опускайтесь до есть </ul>, который определяет конец отдельных штатов / городов, ссылки / текст?

Я играл с этим и могу сделать это, установив outerHtml() в String, а затем проанализировав строку вручную, но я уверен, что есть более простой способ сделать это. Я пробовал text(), а также пробовал attr("div.state_delimiter"), но мне кажется, что я испортил шаблон / процедуру, чтобы сделать это правильно. Интересно, может ли кто-нибудь помочь мне здесь и показать мне, как поместить div.state_delimiter в текстовое поле, а затем <ul><li></li></ul> Я хочу, чтобы все <li></li> под <ul></ul> для каждого состояния. Ищите как можно более удобный http: // && html.

1 Ответ

7 голосов
/ 19 августа 2011

<ul>, содержащий города, является следующим родным братом <div class="state_delimiter">. Вы можете использовать Element#nextElementSibling(), чтобы взять его с этого деления. Вот пример начала игры:

Document document = Jsoup.connect("http://www.craigslist.org/about/sites").get();
Elements countries = document.select("div.colmask");

for (Element country : countries) {
    System.out.println("Country: " + country.select("h1.continent_header").text());
    Elements states = country.select("div.state_delimiter");

    for (Element state : states) {
        System.out.println("\tState: " + state.text());
        Elements cities = state.nextElementSibling().select("li");

        for (Element city : cities) {
            System.out.println("\t\tCity: " + city.text());
        }
    }
}

doc.select("div.state_delimiter,ul") не делает то, что вы хотите. Возвращает все <div class="state_delimiter"> и <ul> элементы документа. Разбор вручную с помощью строковых функций не имеет смысла, если у вас уже есть анализатор HTML.

...