如何使用JSoup在java中获取特定的标记属性文本?

时间:2018-02-19 09:44:46

标签: java web-scraping jsoup

我想在属性中获取url,但每次运行代码时都会出错。 以下是我想要提取链接的源URL的片段:

  **<section class="rslwrp ">
  <div id="tab-5" class="tab-contentphone current">
  <ul class="rsl col-md-12 padding0">
  <input type="hidden" id="closedown_flag0" value="0">
  <li class="cntanr" data-href="https://www.somelink.com" >**

我正在运行的代码

public class Wholelist {
static String url = "https://www.somewebsite.com"; 
static Document doc;
public static void main(String args[]) throws IOException {
    doc = getDoc(url);
    getlink(doc);
}
@SuppressWarnings("deprecation")
static Document getDoc(String url){
    try {
        return   Jsoup.connect(url).userAgent("mozilla/17.0").validateTLSCertificates(false).get();
    } catch (IOException e) {
        e.printStackTrace();
         return null;
    }
}
public static void getlink(Document doc1){
    Element elementlink = doc1.select("section.rslwrp").get(3).select("li.cntanr").get(5);
    String url = elementlink.attr("data-href"); 
    String Link = url;
    System.out.println(Link);
}
}

请指明我的错误,并告诉我正确的方法。

4 个答案:

答案 0 :(得分:0)

rslwrp是否有更多部分而不是1?您正在调用第三个元素,但只有一个元素,因此您将索引超出范围异常:

    Element elementlink = doc1.select("section.rslwrp").get(3).select("li.cntanr").get(5);

答案 1 :(得分:0)

Element elementlink = doc1.select("section.rslwrp").get(3).select("li.cntanr").get(5);

在上面的行中首先检查所选元素是否存在。如果selected元素不为空,则仅检索该元素。

Element elementlink = null;
Elements sectionElements = doc1.select("section.rslwrp");
if(!sectionElements.isEmpty() && elementlink.size() >= 3) {
    Elements liElements = elementlink.get(3).select("li.cntanr");
    if(!liElements.isEmpty() && liElements.size() >= 5) {
        elementlink = liElements.get(5);
    }
}

答案 2 :(得分:0)

好像你正试图获得第三个不存在的“section”元素(只有一个)。该代码将与您的数据一起使用

Element elementlink = doc1.select("section.rslwrp").first().select("li.cntanr").first();
String url = elementlink.attr("data-href");
System.out.println(url);

按预期打印https://www.somelink.com。希望它有所帮助!

评论后修改: 如果我理解正确,那就可以胜任。

List<String> urls = doc.select("section.rslwrp").first().select("li.cntanr")
        .stream().map(e -> e.attr("data-href")).collect(Collectors.toList());
System.out.println(urls);

答案 3 :(得分:0)

您以错误的方式使用选择 你不需要使用两个单独的选择,并使用get()返回错误的元素 要使用URL

Element elementlink = doc1.select("li.cntanr").first();
String url = elementlink.attr("data-href"); 
String Link = url;
System.out.println(Link);

通过此选择直接获取你的元素