[java] wczytanie części tekstu ze strony www

Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[java] wczytanie części tekstu ze strony www

Post autor: Ser Cubus »

hej,
chciałbym wczytać część danych ze strony internetowej. Chciałem sczytać całość do stringa, a następnie wybrać fragmenty które mnie interesują, niestety wyskakuje mi błąd

Kod: Zaznacz cały

Scanner buff = new Scanner(url.openStream());
String url_data = buff.toString();

// błąd który dostaje:
java.util.Scanner[delimiters=p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator= ][decimal separator=,][positive prefix=][negative prefix=Q-E][positive suffix=][negative suffix=][NaN string=Q�E][infinity string=Q∞E]
za to taka opcja już działa

Kod: Zaznacz cały

Scanner buff = new Scanner(url.openStream());
String url_data = buff.nextLine();
Chciałbym wiedzieć czy da się rozwiązać w ten sposób. A jeżeli nie, to czy mogę wczytać to zmiennej buff (co to w sumie jest, bo nie strumień wejścia?) dane które zaczynają się na 1 wyrażeniu, a kończą na drugim (oba są znane)?
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[java] wczytanie części tekstu ze strony www

Post autor: kadiii »

Nie do końca widzę konkretne pytanie, ale postaram się domyśleć.
Masz dwa warianty rozwiązania:
1) Czytać linijka po linijce i szukać odpowiednik znaczników w łańcuchach
2) Użyć jednego z dostępnych parserów, pierwszy z brzegu przyklad z googla ... -do-to-it/

Nie wiem czy o to ci dokładnie chodziło, ale mam nadzieję, że tak.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[java] wczytanie części tekstu ze strony www

Post autor: Ser Cubus »

nie, ale tam jest odpowiedz na kolejne pytanie

cóż, trzeba bedzie iterować po każdym elemencie
Ukryta treść:    
czy w javie wszytko wyjątki oznacza się jako e?
Ostatnio zmieniony 18 maja 2013, o 15:32 przez Ser Cubus, łącznie zmieniany 1 raz.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[java] wczytanie części tekstu ze strony www

Post autor: kadiii »

Nie wiem jakie miałeś więc pytanie, ale jak chcesz na nie odpowiedzi to możesz je sformułować. Jeśli chodzi Ci o parsowanie HTML-u to w zależności od zastosowania i wielkości danych są różne możliwości - możesz poczytać o takich api jak DOM, SAX, StAX, mają różne właśności.
czy w javie wszytko wyjątki oznacza się jako e?
Jeżeli to wbudowany wyjątek (szczególnie nadrzędny Exception) i nie ma na nim wykonywanych wielu operacji to tak. Jeżeli jest to nowy wrapper jakiegoś wyjątku to zazwyczaj nazwa jest bardziej rozbudowana choć jest to kwestia czytelności kodu.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[java] wczytanie części tekstu ze strony www

Post autor: Ser Cubus »

chodziło mi o to czy da się wczytać do obiektu klasy scanner ciąg znaków od wyrażenia A do B. Ale z tym już sobie poradziłem, iterując po każdym elemencie, zapisując elementy od A do B

Mam jeszcze kilka innych pytań:
1) czym właściwie jest klasa Scanner? Zbiera ona informacje ze strumienia wejścia i i może je przekazać do stringa, w c++ nie ma takiego "bufora"

2) czemu to nie działa?


kiedy niezależnie takie instrukcje działają:
Ukryta treść:    
Z tego co czytałem chodzi o to żeby sprawdzić czy kolejny element jest != null, prosiłbym o potwierdzenie i ewentualne rozwiązanie, ponieważ nie czuję się zbyt mocny w javie
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[java] wczytanie części tekstu ze strony www

Post autor: kadiii »

Ad. 1 ... anner.html
Scanner, jak się można domysleć, ma metodę ogólną hasNext.
Ad. 2 Nie działa bo odczytujesz element, który nie istnieje

Uwagi dodatkowe: Metody w Javie zaczynamy z małej litery. Jeśli używam nowego obiektu klasy, której nie znam to przeglądam jego dostępne metody (w Eclipsie skrót Ctrl + Spacja po kropce).

Ad. 2 Dopowiedzenie
Zauważyłem, że jest jeszcze jedno pytanie w punkcie drugim, odpowiem na nie żeby osoby z podobnym problemem miały rozwiązanie:

Kod: Zaznacz cały

while( (end_of_url = buff.nextLine()) != null ){
            System.out.println("a");
            }
Taki kod zwróci na końcu wyjątek. Jak to sprawdzić? Korzystając z jakiegoś IDE najeżdżamy na metodę nextLine() - metoda ma dodany javadoc, czyli rodzaj standardowego opisu. W opisie widzimy:
Throws:
NoSuchElementException - if no line was found
IllegalStateException - if this scanner is closed
Widzimy więc, że metoda zwróci wyjątek jeśli spróbujemy odczytać ze skanera linię, która nie istnieje. Jak więc dojść do tego w jaki sposób operować naszym Scanner-em?
Wchodzimy na dokumentację Javy i szukamy naszej klasy(zwykłe Google + "Scanner javadoc" wystarczy). W opisie dostępnych metod widzimy między innymi:
hasNextLine
public boolean hasNextLine()
Returns true if there is another line in the input of this scanner. This method may block while waiting for input. The scanner does not advance past any input.
Returns:
true if and only if this scanner has another line of input
Throws:
IllegalStateException - if this scanner is closed
Widzimy więc, że nasz obiekt scanner-a posiada metodę, która sprawdza czy znajduje się w nim jeszcze jedna linia. Idealny warunek do pętli iterującej linijka po linijce.

W taki sposób można rozwiązać wiele drobnych problemów, warto więc się zaznajomić z tym jak do tego podejść.
ODPOWIEDZ