Odczytywanie danych z Internetu

0

Witam,
Mam problem z odczytaniem danych zawartych na stronie internetowej. Z pobraniem kodu html problemów nie mam, jednak nie wiem jak zabrać się za wyodrębnienie danych, których struktura wygląda mniej więcej tak:

<tbody id=idtabeli>
<tr><td id=nazwa><a href="adres">nazwa</a></td><td><span id="dane1_id">dane1</span></td><td><span id="dane2_id">dane2</span></td></tr>
<tr><td id=nazwa><a href="adres">nazwa</a></td><td><span id="dane1_id">dane1</span></td><td><span id="dane2_id">dane2</span></td></tr>
[itd...]
</tbody>

Przeszukałem forum, helpa, ale nic sensownego poza String.split nie znalazłem, ale wydaje mi się, że jest to robienie trochę na około (trzeba usuwać ze stringa </tr> , etc). Jakieś sugestie?

0

A procesor/parser XML/HTML? http://htmlparser.sourceforge.net/

0

Chciałbym raczej obyć się bez zewnętrznych bibliotek, gdyż program muszę przynieść na laboratoria z programowania (dlatego też chcę zoptymalizować kod). Utknąłem jednak w tym punkcie i szukam jakiegoś sensownego rozwiązania.

0

@tarkuspl, użycie zewnętrznej biblioteki nie jest złe. Nie wymyślaj koła od nowa. Programowanie ma ułatwiać życie, a nie je utrudniać.

Jeżeli jedank wykładowca nie uczy programowania w nowoczesny sposób...
W samym JDK jest obsługa XMLa. Wystarczy, że wybierzesz z dokumentu elementy tr i potraktujesz je jako osobne dokumenty XML i przeciągniesz przez standardową bibliotekę http://java.sun.com/developer/technicalArticles/xml/JavaTechandXML/#code14

Warunek kod musi być prawidłowym XMLem.

0

Zobacz klasy Pattern, Matcher. Wystarczą w zupełności

0

Do znajdywania pasują jak najbardziej, ale nadal muszę ręcznie wywalać niepotrzebne znaki.

Zastanawia mnie jednak, czy dało by radę wyciągnąć tylko dane, pomijając to co jest w wyrażeniu regularnym (pamiętam, że w php było to możliwe).

            //znalezienie tabeli
            Pattern pattern = Pattern.compile("<tbody align=right style=background-color:ffffff id=f12>.*</tbody>");
            Matcher matcher = pattern.matcher(inputLine);
            if(matcher.find())  {
                String table = matcher.group();
                //dalsze zabawy w wyciąganie danych, jednak chciałbym jedynie tekst bez znaczników tbody
                System.out.println(table);    
            } else System.out.println("Brak danych");
0

Zastosuj tzw. grupowanie

Pattern pattern = Pattern.compile("<tbody[^>]*>(.*)</tbody>");
Matcher matcher = pattern.matcher("<tbody align=right style=background-color:ffffff id=f12>abc</tbody>");
if (matcher.find()) {
	String text = matcher.group(1); // grupa 1 =  (.*)
	System.out.println(text); //abc
} else
	System.out.println("Brak danych");

lub aby nie powtarzać "tbody":

Pattern pattern = Pattern.compile("<(tbody)[^>]*>(.*)</\\1>");
Matcher matcher = pattern.matcher("<tbody align=right style=background-color:ffffff id=f12>abc</tbody>");
if (matcher.find()) {
	String text = matcher.group(2);  // grupa 2 =  (.*)
	System.out.println(text); //abc
} else
	System.out.println("Brak danych");
}

Jeżeli interesuje cię po prostu wszystko, co nie jest w znacznikiem, to można to banalnie zrobić tak:

String s = "<tbody id=idtabeli><tr><td id=nazwa><a href=\"adres\">nazwa</a></td><td><span id=\"dane1_id\">dane1</span></td><td><span id=\"dane2_id\">dane2</span></td></tr>"+
"<tr><td id=nazwa><a href=\"adres\">nazwa</a></td><td><span id=\"dane1_id\">dane1</span></td><td><span id=\"dane2_id\">dane2</span></td></tr></tbody>";
Pattern pattern = Pattern.compile("<[^>]*>");
Matcher matcher = pattern.matcher(s);
System.out.println(matcher.replaceAll("")); //nazwadane1dane2nazwadane1dane2

Wszystko masz opisane tu:
http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1