2017-01-22 6 views
0

Вот фрагмент кода, я написал:Невозможно получить конкретные данные из таблицы с помощью Jsoup

String url = "https://www.premierleague.com/tables"; 

doc = Jsoup.connect(url).get(); 
table = doc.select("table").first(); 

rank = table.select("td[id=tooltip]").iterator(); //Position 
team = table.select("td[class=team]").iterator(); //Club 
points = table.select("td[class=points]").iterator(); //Points 

я могу получить данные, такие как позиция, клуб и очки, потому что я могу идентифицировать их с именем класса или ID, но я 'm не может получить другие данные, такие как Played, Won, Draw, Loss, GF, GA, GD и т. д.

Может кто-нибудь мне помочь?

+0

Is это разрешено? Тогда, пожалуйста, примите данный ответ, иначе опубликуйте следующий комментарий в комментариях. Что касается «вне темы»: не согласен, проблема в том, как выбрать элементы без id или класса, и вся информация задается в вопросе. –

+1

Ответ принят, извините за поздний ответ. И да, это не вне темы, согласился. – CodePlorer

ответ

3

Вы можете использовать селекторы на основе структуры, см этого примера для первой записи в колонке выиграло: http://try.jsoup.org/~camnKp8NJYL0meyfIRXEtV8E5B4

Чтобы получить селекторы правильно, вы можете использовать инструменты разработчика в Google Chrome (f12), правая кнопка мыши на элементе на вкладке Элементы и выберите Copy -> Copy selector.

Iterator<Element> gamesPlayed = table.select("tbody tr > td:nth-child(4)").iterator(); 
Iterator<Element> gamesWon = table.select("tbody tr > td:nth-child(5)").iterator(); 
Iterator<Element> gamesDrawn = table.select("tbody tr > td:nth-child(6)").iterator(); 
Iterator<Element> gamesLost = table.select("tbody tr > td:nth-child(7)").iterator(); 

В качестве альтернативы разбора строки таблицы и хранить значения ячеек, как показано в следующем примере:

Пример кода

String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36"; 
String url = "https://www.premierleague.com/tables"; 

Document doc; 
String position, club, played, won; 

try { 
    doc = Jsoup.connect(url).userAgent(userAgent).get(); 

    Element table = doc.select("table").first(); 

    for (Element row : table.select("tr")) { 

     Elements cells = row.select("td"); 

     if(cells.size()<5) continue; 

     position = cells.get(1).select(".value").first().text(); 
     club = cells.get(2).select(".long").first().text(); 
     played = cells.get(3).text(); 
     won = cells.get(4).text(); 

     System.out.println(position + " " + " " + club + "\n\tplayed: " + played + " won: " + won); 

    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Выход

1 Chelsea 
    played: 21 won: 17 
2 Arsenal 
    played: 22 won: 14 
3 Tottenham Hotspur 
    played: 22 won: 13 
4 Liverpool 
    played: 22 won: 13 
5 Manchester City 
    played: 22 won: 13 
... 
+0

Можете ли вы объяснить, как это будет использоваться в моем коде? – CodePlorer

+0

@CodePlorer См. Обновленный ответ. –

+0

Но это не полезно для меня, мне нужны данные из отдельных полей, сопоставленных с элементами GUI. Например, textField1 -> соответствует сыгранным командами с рейтингом 1, textField2 -> матчи, сыгранные командой в рейтинге 2. Я могу легко сделать это с помощью Iterator, используя next() ... Можете ли вы помочь с этим? – CodePlorer