Skocz do zawartości
SanFable

Pobieranie danych z strony i parsowanie

    Rekomendowane odpowiedzi

    Witam,

    aktualnie dla mojej klasy zrobiłem pierwszą sensowną aplikację- plan lekcji, szybki, łatwy, 5 guzików (dni tygodnia), powiększanie/zmniejszanie tekstu i takie tam pierdołki...

    od niedawna w mojej szkole w końcu ktoś podaje zastępstwa na stronie i to na cały tydzień, super byłoby to wykorzystać i dodać opcję wyświetlania zastępstw w tej aplikacji.

    strona z tabelką jest dostępna tutaj Zespół Szkół im. I. Łukasiewicza w Policach - zastępstwa - Zastępstwa

    jak chciałbym, żeby ta funkcja wyglądała?

    menu->guzik zastępstwa->pobieramy zastępstwa z internetu->wyświetlamy tylko te linijki, które są do mojej klasy

    no i w zasadzie tutaj zaczynają się schody

    za co mam się złapać?

    na pewno musi być filtr, żeby wyświetlało tylko "linijkę" dotyczącą mojej klasy, ale całkowicie nie mam pomysłu jakim sposobem mam pobrać te dane, czy ściągnąć stronę i tam jakoś wyszukać? z jednej strony nie ma problemu, ale to jest tabelka... i tu jest problem

    jakieś pomysły?

    jak ktoś ma jakiś pomysł to niech rzuci czymś więcej niż słowem, bo nawet nie wiem jakich funkcji mógłbym użyć ;)

    android minimum 2.3

    Edytowane przez Dzakus
    Uogólnienie tematu

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Cubaza

    Zainteresuj się jsoup. Jest to parser HTML. Będziesz mógł robić co chcesz z tabelą.

    Wysłane z mojego Nexus 4 przy użyciu Tapatalka

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    kurde, przegooglowałem ten temat, znalazłem przykład z projektem bo na takim najlepiej się połapać a tu nic... nie mam pojęcia jak to zrobić ;x

    jakieś porady ;)?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Dzakus

    Pewną metodą, ale "ugly" i odradzaną, jest regexp. W każdej firmie, gdy zastosujesz taki hax to powinni cie zjeść, ale tutaj możesz sobie na to pozwolić. Za moment postaram się przygotować regexpa jakiegoś.

    Regexp: http://wklej.to/Guk0m/text (do poprawki, ale już jakiś start :-))

    Nie testowałem na Javie. Może brakować jakieś składni w Javie musisz dokonać ekspertyzy. Ja korzystałem z Notepad++ z funkcji zamiany dotycząca regexpa i nowej lini

    Poprawne metody to jsoup, XMLParsery np. XMLPullParser

    Do poczytania linki:

    http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

    http://jsoup.org/ Spójrz na menu po prawej

    Przykład dla Ciebie: http://try.jsoup.org/~wmxN8wP89xP8jvtOAcoWNL-iXAY

    http://www.vogella.com/articles/JavaRegularExpressions/article.html

    Edytowane przez Dzakus

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Ja bym np zrobił linijkę kodu pobierającą dane

    try {

    byte[] bText = new byte[25000];

    text = new URL("adres");

    InputStream isText = text.openStream();

    isText.read(bText);

    String a=new String(bText);

    OutputStreamWriter out = new OutputStreamWriter(openFileOutput("plik.txt",0));

    out.write(a);

    out.close();

    isText.close();

    } catch (MalformedURLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    w ten sposób masz cały plik html.. następnie z tablicy pobierasz kolejne linijki i jeśli w tej linijce jest np. td>4</td> pobierasz kilka znaków w przód(np do kolejnego '<') i kilka w tyl np do>

    Pamietaj przy okazji o zezwoleniu na dostęp aplikacji do internetu. JA się z tym męczyłem:)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Cubaza

    @up, dlatego ktoś się nudził i stworzył coś takiego jak jsoup, o którym wspomniałem wcześniej. Zamiast pobierać i parsować i sprawdzać iks znaków wstecz i w przód, to pobiera ładnie to co chcemy. Wystarczy podać tag bądź coś podobnego. I nic nie trzeba się męczyć ;-)

    Wysłane z mojego Nexus 4 przy użyciu Tapatalka

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    A nie lepiej, abyś zrobił sobie jakis skrypt w PHP, który przeparsuje Ci stronę i zwróci Ci dane np. w json? Zauważ, że jeśli zmienią na szkole wygląd strony lub dadzą inne znaczki to cała aplikacja padnie - a tak, poprawisz sobie tylko w skrypcie i będzie nadal działać. Zamiast pobierać całą stronę na telefon - niech robi to skrypt na serwerze i zwróci Ci tylko potrzebne Ci dane (zmniejszy to koszty transferu).

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Grins

    Z czym w ogóle miałeś problem?

    Cubaza podał Ci rozwiązanie prawie na ręku.

    A ode mnie masz już cały działający kod:

    https://gist.github.com/DawidSajdak/e7fd9cd1a69389de8548

    A JSOP pobierz z http://jsoup.org/packages/jsoup-1.7.3.jar

    Czy naprawdę to takie trudne, usiąść, poczytać, pomyśleć?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    woah, myślałem, że ten temat umarł ;)

    dziękuję wszystkim za podpowiedzi, a nawet za gotowe kody (nie spodziewałem się tego)

    teraz na pewno usiądę przy tym i zobaczę jak to działa ;)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    laney

    Witam.

    Jestem początkująca, mam problem i proszę o pomoc, za ew. podpowiedzi z góry dziękuję!

    Program, który Na razie wczytuje mi całe źródło strony, i tu nie wiem jak zrobić, aby wyświetlało mi tylko treść strony html tylko od <div> do </diva>

    Czy można w to jakoś zaimplementować SubString może? Nie wiem jak to ogryźć..

    Mam coś takiego:

    String str = DownloadText("http://www.student-gotuje.pl/");
           TextView txt = (TextView) findViewById(R.id.textView1);
           txt.setText(str);        
       }   
    
    
       private InputStream OpenHttpConnection(String urlString) throws IOException
       {
           InputStream in = null;
           int response = -1;
    
           URL url = new URL(urlString); 
           URLConnection conn = url.openConnection();
    
           if (!(conn instanceof HttpURLConnection))                     
           throw new IOException("brak połączenia");
    
           try{
           HttpURLConnection httpConn = (HttpURLConnection) conn;
               httpConn.setAllowUserInteraction(false);
               httpConn.setInstanceFollowRedirects(true);
               httpConn.setRequestMethod("GET");
               httpConn.connect(); 
    
           response = httpConn.getResponseCode();                 
               if (response == HttpURLConnection.HTTP_OK) {
               in = httpConn.getInputStream();                                 
               }                     
           }
           catch (Exception ex)
           {
           throw new IOException("problem z połączeniem");            
           }
           return in;     
       } 
    
    
       private String DownloadText(String URL)
       {
           int BUFFER_SIZE = 2000;
           InputStream in = null;
           try {
               in = OpenHttpConnection(URL);
           } catch (IOException e1) {
               // TODO Auto-generated catch block
               e1.printStackTrace();
               return "";
           }
    
           InputStreamReader isr = new InputStreamReader(in);
           int charRead; 
           String str = "";
           char[] inputBuffer = new char[bUFFER_SIZE];          
           try {
               while ((charRead = isr.read(inputBuffer))>0)
               {                    
    
                   String readString = String.copyValueOf(inputBuffer, 0, charRead);
                   str += readString;
                   inputBuffer = new char[bUFFER_SIZE];
               }
               in.close();
           } catch (IOException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
               return "";
           }    
           return str;    

    Edytowane przez Dzakus
    Kod umieszczamy w znaczniku [ CODE ], a gdy jest długi to dodatkowo w znaczniku spoiler.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x