如何使用Java中的jSoup获取span标记中的所有类属性

时间:2018-03-31 04:57:49

标签: java jsoup

我正在使用Jsoup从页面中提取数据:

https://www.justdial.com/Indore/Shahi-Bhog-Caterers-Opposite-Sayaji-Behind-Hotel-Park-Vijay-Nagar-Vijay-Nagar/0731PX731-X731-120525133215-B7M1_BZDET?xid=SW5kb3JlIENhdGVyZXJz

现在我想获得属于span标记的所有类属性。但我无法得到所有这些。我随机获得一个属性,重复3次。我不知道为什么。

 package scrapers;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 *
 * @author kushagrabehere
 */


public class ReviewCounter {


  void ReviewCounters() throws IOException
    {
    Document doc=Jsoup.connect("https://www.justdial.com/Indore/Shahi-  Bhog-Caterers-Opposite-Sayaji-Behind-Hotel-Park-Vijay-Nagar-Vijay-Nagar/0731PX731-X731-120525133215-B7M1_BZDET?xid=SW5kb3JlIENhdGVyZXJz").get();
            Elements contactNumber=doc.select("a.tel.ttel");
            System.out.println("contact :" );
    String cContact;

    for(Element numbers:contactNumber){



            cContact=numbers.getElementsByTag("span").attr("class");
            System.out.println("contact :" + cContact);

        }

enter image description here

我希望获得联系号码中显示的所有类名:

2 个答案:

答案 0 :(得分:0)

首先,您需要检查是否获得完整的HTML,

如果使用JS渲染HTML,则JSOUP无法访问该元素,因为Jsoup不会自行执行JS代码。

检查html create 1文件并搜索所需的DOM是否可用。

尝试类似下面的内容

FileWriter fw = new FileWriter(new File("C:/demo.html"));
        Document doc=Jsoup.connect("https://www.justdial.com/Indore/Shahi-  Bhog-Caterers-Opposite-Sayaji-Behind-Hotel-Park-Vijay-Nagar-Vijay-Nagar/0731PX731-X731-120525133215-B7M1_BZDET?xid=SW5kb3JlIENhdGVyZXJz").get();
        fw.write(doc.toString());
        Elements contactNumber=doc.getElementsByClass("a.tel.ttel");
        System.out.println("contact :" );
        String cContact;


        for(Element numbers:contactNumber){
            cContact=numbers.getElementsByTag("span").attr("class");
            System.out.println("contact :" + cContact);
        }

        fw.close();

答案 1 :(得分:0)

首先你应该按照Alpesh Jikadra的建议在他的回答中做,并检查这些信息是否是动态加载的。

你这样做:

Elements contactNumber=doc.select("a.tel.ttel");

这将选择具有tel和ttel类的所有锚元素。当我在浏览器中打开页面时,我只找到一个这样的元素。因此,当您对所有找到的a元素进行循环时,您可能只执行一次。

您要做的是在循环内的每个a元素中查找所有span元素。像这样:

for(Element numbers:contactNumber){
  Elements digitSpans = numbers.select("span.mobilesv");
  for (Element digitSpan : digitsSpans){
     String digitClasses = digitSpan.attr("class");
     //look up which icon class is which number or do do whatever
  }
}

请注意,上面的代码未经过测试,只是在答案框中输入。我没让它跑。

BTW:你也可以通过Element.classNames()获取Jsoup中的各个类(参见Jsoup get class name