有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSoup:检索不包含特定属性的元素

我有一个包含以下逻辑的表

  1. 该表显示名称列表
  2. 对于包含<tr class=hiderow><td class=packagename>...</td></tr>->;此行将不可见

因此,表可能包含100行,但是如果有20行包含class=hiderow,那么用户只能在页面上看到80行。我想检索这80行(不是100行)的名称。所以我需要解析出不包含class=hiderow的数据。我知道如何使用jsoup获得每个名字,我还看到文档中有 :not(selector) elements that do not match the selector.但我不知道如何使用它。请帮忙

编辑我已经想出了办法。如果有更好的办法,请告诉我
EDIT2请使用BalusC提供的以下解决方案。它干净多了

public void obtainPackageName(String urlLink) throws IOException{
    List<String> pdfList = new ArrayList<String>();
    URL url = new URL(urlLink);
    Document doc = Jsoup.parse(url, 3000);
    Element table = doc.select("table[id=mastertableid]").first();
    Iterator<Element> rowIter = table.select("tr").iterator();
    while(rowIter.hasNext()){
        Element row = rowIter.next();
        if(!row.className().contains("hiderow")){
            Element packageName = row.select("td[class=packagename]").first();
            if(packageName != null){
                pdfList.add(packageName.text());
            }

        }
    }
}

共 (1) 个答案

  1. # 1 楼答案

    你需要在感兴趣的元素(在你的例子中是tr)上应用:not(),然后将元素相关的CSS选择器传递给它,元素不应该匹配它(在你的例子中是.hiderow

    因此,这应该做到:

    Document document = Jsoup.connect(urlLink).get();
    Elements packagenames = document.select("#mastertableid tr:not(.hiderow) td.packagename");
    List<String> pdfList = new ArrayList<String>();
    
    for (Element packagename : packagenames) {
        pdfList.add(packagename.text()); 
    }