Как получить конкретные строки с Jsoup - PullRequest
0 голосов
/ 21 ноября 2018

Это исходный код, который я пытаюсь очистить с помощью Jsoup.Я заинтересован в получении данных из следующих источников: «Кодовый номер», «Доступная дата», «Тип», «Порода», «Пол», «Возраст», «Вес» и «Плата за усыновление».То есть я ищу вывод:

Кодовый номер: 107796

Дата в наличии: 11/20/2018

Тип: Собака

Порода: Немецкая овчарка

Пол: кобель

Возраст: 2 года, 0 месяцев

Вес: 64,6 фунта

Плата за усыновление: 250 $

Исходный код от: view-source: https://southwesthumane.org/adopt/dogs/dog-details/?id=84807 Строки 186-215

<div id="ContentPlaceHolder_Item3_AnimalDetails_2_divDetails">
<h3>Alan</h3>
<div class="float-to-right animal-slideshow">
<div class="cycle-slideshow" data-cycle-fx="Fade" data-cycle-timeout="0" data-cycle-auto-height="container" data-cycle-pager="#adv-custom-pager" data-cycle-pager-template="<a href='#'><img src='{{src}}' width=50 height=50></a>">
<img src="http://southwesthumanepets.shelterbuddy.com/photos/lostfound/84807.jpg" />
</div>
<div id="adv-custom-pager"></div>
</div>
<div class="AnimalDetails">
<p>Alan is looking for a new best friend! Could it be you? Alan is new to the shelter and we are still getting to know his unique personality. If Alan looks like your dream dog, let the staff know you are interested in meeting him. Going to a new home can be exciting and strange for pets, so it's best for them to meet any children and other dogs in their future home. Alan can't wait to meet his forever family!</p>
<br />
<strong>Code Number: </strong>107796
<br />
<strong>Date Available: </strong>11/20/2018
<br />
<strong>Type: </strong>Dog
<br />
<strong>Breed: </strong>German Shepherd Dog
<br />
<strong>Sex: </strong>Male
<br />
<strong>Age: </strong>2 years, 0 months
<br />
<strong>Weight: </strong>64.6 lbs
<br />
<strong>Adoption Fee: </strong>$250
<br />
<br />
</div>
</div>

Вот мой код:

	    try{
                Document dogs = Jsoup.connect("https://southwesthumane.org/adopt/dogs/").get();
                Elements links_dogs = dogs.select(":containsOwn(Details »)");
                for (Element link : links_dogs) {
                    String test = "https://southwesthumane.org" + link.attr("href");
                    System.out.println("url: " + test);
                    try{
                        Document dog = Jsoup.connect(test).get();
                        Elements name = dog.select("h3");
                        Elements description = dog.select("div.Animaldetails");
                        for (Element code : name) {
                            System.out.println("Name: " + code.text());
                        }
                        for (Element code : description) {
                            System.out.println("Description: " + code.select("p").text());
                            System.out.println(code.select("strong").first().text());
                            System.out.println(code.select("div.Animaldetails").text());
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

Эта строка:

System.out.println (code.select ("div.Animaldetails"). Text ());

забирает всю необходимую мне информацию, но я не знаю, как анализировать каждую отдельную строку, потому что в конечном итоге я сохраню каждую отдельную информацию в списке.Любая помощь будет принята с благодарностью.Спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я проверил @Eritrean ответ, но я думаю, что мой подход ближе, чтобы получить именно то, что вы ищете, более ясным способом!Вот пример кода, чтобы сделать именно то, что вы хотите, используя JSOUP :

public class Main {

    public static void main(String[] args) {
        try {
            String url = "https://southwesthumane.org/adopt/dogs/dog-details/?id=84807";

            Document document = Jsoup.connect(url).userAgent("Mozilla/5.0").get();
            Elements elements = document.select("div.AnimalDetails > strong");

            for (Element element : elements) {
                System.out.println(element.text() + element.nextSibling().toString());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Как видите, для установления соединения с нужным URL вам просто нужно выбрать всесильные теги HTML, содержащиеся внутри тега div HTML с именем класса AnimalDetails .

Как только вы это сделаете, вы получите объект Elements из JSOUP, и вам нужно зациклить его, используя цикл FOR EACH.В котором вы собираетесь получить все элементы, содержащие сильный HTML-тег.

Теперь вам нужно извлечь текст, содержащийся между этими тегами, с помощью селектора .text () из JSOUP, и, поскольку HTML-код структурирован, вам нужно получить следующееэлемент, это значение, которое вы ищете.

Поскольку структура HTML AnimalDetails div выглядит следующим образом:

<br>
<strong>Code Number: </strong>107796
<br>
<strong>Date Available: </strong>11/20/2018
<br>
...
and so on

Теперь вам нужно получитьродственный элемент сильного тега HTML с помощью селектора .nextSibling () из JSOUP и преобразование его в строку с помощью метода .toString () .Это, как вы можете видеть, возвращает значение, которое вы ищете.Затем вам просто нужно распечатать его как желаемый вывод, как описано в новом цикле FOR EACH.

Ваш желаемый вывод будет выглядеть следующим образом:

desired scrapping output

Надеюсь, это помогло вам!Для получения дополнительной информации не стесняйтесь спрашивать меня!

0 голосов
/ 21 ноября 2018

Вы можете выбрать сильные HTML-теги, и для каждого полученного тега получите nextSibling.Попробуйте, изменив для каждой петли :

for (Element code : description) {
    System.out.println("Description: " + code.select("p").text());
    System.out.println(code.select("strong").first().text());
    System.out.println(code.select("div.AnimalDetails").text());
}

на:

for (Element code : description) {
     Elements strongs = code.select("strong");
     for(Element e : strongs){
         System.out.println(e.text() + e.nextSibling().toString());
     }
     System.out.println();
}
...