JSoup: извлекать элемент, который не содержит определенного атрибута

#java #jsoup

#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:

Вам нужно применить :not() к интересующему элементу (который tr в вашем случае), а затем передать в него относительный к элементу 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()); 
}
  

Комментарии:

1. это выглядит намного чище, я попробую это. TY BalusC