如何使用jsoup从android studio中的ul li获取数据

时间:2017-09-09 20:07:27

标签: java web-scraping jsoup

我正在尝试获得产品1和产品2,但我无法得到它的帮助 我正在使用jsoup和排球

<ul id="searched-products">
    <li>
        <div class="gd-col navUnitContainer1 gu4">
            <div class="product_name">
                <a>Prodict 1</a>
            </div>
        </div>
    </li>
    <li>
        <div class="gd-col navUnitContainer1 gu4">
            <div class="product_name">
                <a>Prodict 2</a>
            </div>
        </div>
    </li>
</ul>

我试过这个

Elements itemElements = doc.select("ul#searched-products li");

但它没有选择“li”。我也试过这个

Elements itemElements = doc.select("ul#searched-products"); //this line works
Element e1 = itemElements.get(i);
e1.select("li"); or item.getElementsByTag("li");

仍然没有好处...... 有数百个李,所以我不能这样做

doc.select("li");

请提出建议

3 个答案:

答案 0 :(得分:0)

像这样:

public class JsoupList {

public static void main(String[] brawwwr){
    String html = "<ul id=\"searched-products\">" +
"<li>" +
    "<div class=\"gd-col navUnitContainer1 gu4\">" +
        "<div class=\"product_name\">" +
            "<a>Prodict 1</a>" + 
        "</div>" + 
    "</div>" +
"</li>" +
"<li>" +
    "<div class=\"gd-col navUnitContainer1 gu4\">" +
        "<div class=\"product_name\">"+
            "<a>Prodict 2</a>" +
        "</div>" +
    "</div>" +
"</li>" +
"</ul>";

    Document doc = Jsoup.parse(html);

    Elements itemElements = doc.select("ul#searched-products li");

    for(Element elem : itemElements){

        System.out.println(elem.select("div div a").text());
    }
}

}

将返回

Prodict 1

Prodict 2

您可以将标记内的重复代码想象成一个自己的小页面。 问候

答案 1 :(得分:0)

试试此代码。

Elements itemElements = doc.select("ul#searched-products");
itemElements = itemElements.select("li");
for(Element ele : itemElements){
String text = ele.text();
System.out.println(text); //this will return Prodict 1 and Prodict 2 
}

//  or u can try by getting all the a

for(Element ele : itemElements){
 String text = ele.select("a").first().text();
 System.out.println(text); //this will also return Prodict 1 and Prodict 2
}

答案 2 :(得分:0)

要排除列表外的<li><a>标记,您需要限制选择器仅匹配列表内部。最好的方法是使用ID(#searched-products)。然后,请勿从<li>中选择<a>doc个标记,而是从所选的<ul>元素中选择。{/ p>

您可以使用以下任何选择器(不是完整列表)获取文本:

  • #searched-products li a
  • #searched-products a
  • #searched-products .product_name a
  • #searched-products .product_name

即使是最后一个也没关系,因为您只需要文字,div.product_name只包含<a>标记。

for(Element e: doc.select("#searched-products .product_name")) {
    String t = e.text(); // Prodict N
}

顺便说一句,<li>内选择ul#searched-products标签的原始方法应该有用。如果不返回任何内容,则可能是该列表在该页面上动态生成。您可以通过打印出Jsoup所拥有的HTML(doc.html()doc.select('#searched-products').html())来轻松测试。

如果确实如此,Jsoup对你来说不是合适的工具。我建议您使用Selenium可能使用无头浏览器(HtmlUnitPhantomJS)。他们可以返回甚至与动态创建的元素进行交互,因此可以简化爬网过程的其他部分。