如何使用Jsoup获得特定行

时间:2018-11-20 23:47:34

标签: jsoup

这是我试图用Jsoup抓取的源代码。我有兴趣从以下代码中获取数据:“代码编号”,“可用日期”,“类型”,“品种”,“性别”,“年龄”,“体重”和“收养费”。也就是说,我正在寻找输出:

编号:107796

日期可用:11/20/2018

类型:狗

品种:德国牧羊犬

性别:男性

年龄:2年0个月

重量:64.6磅

收养费:$ 250

源代码来自: 查看来源: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 :(得分:0)

您可以选择强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();
}

答案 1 :(得分:0)

我检查了@厄立特里亚的答案,但我想我的方法更接近,可以更清楚地获得所需的内容!这是一个示例代码,可以完全使用 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的连接,只需选择包含在类名称为 AnimalDetails 的div HTML标签中的所有强HTML标签。

执行完该操作后,您将从JSOUP获取Elements对象,并且需要使用FOR EACH循环对其进行循环。在其中,您将获得包含强大HTML标记的所有元素。

您现在要做的是使用JSOUP中的 .text()选择器来检索这些标签之间包含的文本,并且在HTML代码结构化之后,您需要检索下一个元素,这就是您要寻找的价值。

AnimalDetails div的HTML结构如下:

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

您现在需要使用JSOUP中的 .nextSibling()选择器来获取强HTML标记的同级元素,然后使用 .toString()将其转换为字符串强>方法。如您所见,这将检索您要查找的值。然后,您只需按照新的FOR EACH循环中所述将其作为所需的输出进行打印即可。

您所需的输出将如下所示:

desired scrapping output

希望这对您有所帮助!有关更多信息,请随时问我!