Gå til innhold

Klippe ut tekst fra en lang string


Anbefalte innlegg

Jeg prøver å lage et program som gjør et søk på google og henter ut overskriftene og linkene til resultatene.

 

Har funnet ut at denne informasjonen ligger i følgende linje i kildekoden til et googlesøk

<a href="http://www.imdb.com/title/tt0105695/" class=l><em>Unforgiven</em> (1992)</a>

Det jeg har tenkt til å gjøre er å laste inn hele kildekoden til søket som en streng, for så å hente ut infoen jeg har lyst på som i tilfellet over vil være http://www.imdb.com/title/tt0105695/ og Unforgiven.

 

Så hvordan kan jeg gjøre det eller eventuelt en annen og bedre måte?

Lenke til kommentar
Videoannonse
Annonse

Som data_jepp sa, har Google sikkert noe I APIen sin for dette, men hvis du ønsker å hente det ut fra teksten, kan du bruke regulære uttrykk. :)

 

Du burde ta en titt på noen hjelpesider for regulære uttrykk. (Bare søk etter "regular expressions" eller "regex")

 

Hvis du ikke orker, kan du bare se på denne koden som gjør omtrent det du ønsker(tror jeg)

 

import java.util.regex.*;
...
String site = getWebsite();
Pattern regex = Pattern.compile("<a href=\"([^\"]+)\" class=l><em>([^<]+)</em>");
Matcher matcher = regex.matcher(site);

while (matcher.find()) {
String url = matcher.group(1);
String title = matcher.group(2);
addResult(url, title);
}

 

Håper det hjalp. :)

Lenke til kommentar
import java.util.regex.*;
...
String site = getWebsite();
Pattern regex = Pattern.compile("<a href=\"([^\"]+)\" class=l><em>([^<]+)</em>");
Matcher matcher = regex.matcher(site);

while (matcher.find()) {
String url = matcher.group(1);
String title = matcher.group(2);
addResult(url, title);
}

 

Håper det hjalp. :)

Det gjorde det. Tusen takk, men kunne du forklart denne setningen litt bedre?

Pattern regex = Pattern.compile("<a href=\"([^\"]+)\" class=l><em>([^<]+)</em>");

Skjønner ikke helt hvordan du har delt opp setningen inne i Pattern.compile().

 

Har fått et annet problem også nå. Virker ikke som google tillater å gjøre søk slik som jeg ville. Det jeg tenkte var å ta URLen

http://www.google.no/search?hl=no&q=unforgiven&meta=&aq=f&oq=

og bare bytte ut unforgiven med det jeg ville søke etter. Dette fungerer utmerket hvis jeg gjør det i browseren min, men hvis jeg prøver via java med koden under får jeg "Server returned HTTP response code: 403", som betyr at servern ikke gir tilgang.

URL url = new URL("http://www.google.no/search?hl=no&q=unforgiven&btnG=Søk&meta=");
InputStream stream = url.openStream();

Så det ser ut som jeg må bruke google APIen alikevel hvis ingen har en genial ide'.

Lenke til kommentar

Hva er det du bruker for å hente ned sidene? Bruker du java.net.URL og InputStreamReader eller noe i den duren? Hvis det er tilfelle, kan det være derfor du får 403. Google forventer nok at du sender diverse cookies.

 

Sjekk HttpClient under Jakarta Commons. Denne har støtte for cookies.

 

Ellers ville jeg nok selv benyttet et Google API, hvis det støtter det du prøver å få til.

 

Werner

Lenke til kommentar
Det gjorde det. Tusen takk, men kunne du forklart denne setningen litt bedre?

Pattern regex = Pattern.compile("<a href=\"([^\"]+)\" class=l><em>([^<]+)</em>");

Skjønner ikke helt hvordan du har delt opp setningen inne i Pattern.compile().

 

Det er et regulært uttrykk. Ganske nyttig å lære seg! :)

 

<a href=\"([^\"]+)\" class=l><em>([^<]+)</em>

(Man kan ikke bruke " inne i strenger, så jeg må 'escape' dem med \)

 

([^bokstav]+)

Dette betyr at den skal putte alt den finner helt til den kommer til "bokstav" i matcher.group(n), hvor n er nummeret til parentesen.

F.eks:

Streng: "hallo verden!"
Regex: ([^v]+)
matcher.group(1) = "hallo "

 

Alt som ikke er "spesialbokstaver" i en regex blir tolket som ren tekst og må finnes før den leter etter resten.

Streng: <b>hei</b>
Regex: hei<([^>]+)>
matcher.group(1) = "/b"

 

Oi, jeg må gå nå, så jeg får ikke skrevet ferdig, du får ta en titt her: http://www.regular-expressions.info/

Lenke til kommentar
import java.util.regex.*;
while (matcher.find()) {
String url = matcher.group(1);
String title = matcher.group(2);
addResult(url, title);
}

Da skjønte jeg det ja så takk for det. Men hva med while-løkken?

Vil da svarene legge seg i url og title så hvis jeg vil skrive dem ut på skjerm skriver jeg bare System.out.println(url +""+title);?

Jeg tenker også spesielt på addResult(url, title). Hva gjør den? Den ville heller ikke kompilere når jeg prøvde.

Lenke til kommentar
Men hva med while-løkken?

While-løkken er der så den finner alle, og ikke bare en linje. ;)

 

Vil da svarene legge seg i url og title så hvis jeg vil skrive dem ut på skjerm skriver jeg bare System.out.println(url +""+title);?

Ja.

 

Jeg tenker også spesielt på addResult(url, title). Hva gjør den? Den ville heller ikke kompilere når jeg prøvde.

Det er fordi den ikke eksisterer!

Det var bare ment som en "gjør noe med url og title"-metode, du kan gjøre hva som helst med dem. :p

Endret av RavnTM
Lenke til kommentar
Det er fordi den ikke eksisterer!

Det var bare ment som en "gjør noe med url og title"-metode, du kan gjøre hva som helst med dem. :p

Hehe. ok.

Jeg fant forresten ut av problemet med 403 feilen. Det hadde ikke noe med cookies å gjøre, men mange sider vil bare at det er nettlesere som skal få tilgang for å forhindre bot'er ol.

 

Fikset det slik:

url = new URL(urlName);

HttpURLConnection httpcon = (HttpURLConnection) url.openConnection(); 
httpcon.addRequestProperty("User-Agent", "Mozilla/4.76"); 
BufferedReader in = new BufferedReader(new InputStreamReader(httpcon.getInputStream()));

På den måten tror siden at det er Mozilla/4.76 (Firefox) som henter siden.

Endret av siggivara
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...