JSoup: Получить элемент, который не содержит определенного атрибута - PullRequest
3 голосов
/ 27 октября 2011

У меня есть таблица, которая содержит следующую логику.

  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 Ответ

7 голосов
/ 27 октября 2011

Вам нужно применить :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()); 
}
...