PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Programm um URL-Link nach Wort zu durchsuchen



k34nu
10.03.2016, 21:41
Hallo,
ich wollte mal wissen wie aufwendig es ist ein kleines Java-Programm zu schreiben, dass mit einer URL-Liste gefüttert wird, jeden URL-Link aufruft und in dem Quellcode der Seite nach einem bestimmten Wort sucht und dann das darauffolgende Wort rauskopiert und in einer .txt speichert.

Ich habe leider keine guten Java Kenntnisse, lediglich Grundlagen hat man mir beigebracht im Studium, die bringen mir hier aber nicht viel.
Wäre cool wenn mir da jemand weiter helfen könnte

Cystasy
10.03.2016, 21:51
Grundsätzlich gesehen, ist dies nicht Schwer.. solltest du wenn du es im Studium gehabt hast auch packen.
Mal ein paar Stichworte:

- Array Liste (Urls zwischenspeichern)
- Dateioperationen (.txt mit Urls auslesen, Wort speichern)
- HTTP Requests (Url aufrufen)
- http://dbs.cs.uni-duesseldorf.de/lehre/docs/java/javabuch/html/k100071.html#sectlevel3id011002005

Sollte nicht so schwer sein das zu erstellen, vorallem wenn du Java bereits ein bisschen kannst.

grüße

k34nu
10.03.2016, 21:59
ok vielen Dank, dann nehm ich das mal in Anrgiff.

blackberry
11.03.2016, 10:43
[...] nach einem bestimmten Wort sucht und dann das darauffolgende Wort rauskopiert und [...]
Wenn man, wie Cystasy vorschlug, zunächst nur das Schlagwort sucht, dann muss man sich wohl trotzdem noch den String von dieser Position an weiter durchlaufen und schauen, was davon das darauffolgende Wort ist und was nicht. Das ist unnötig aufwändig. Für solche Probleme gibt es RegEx (http://www.tutorialspoint.com/java/java_regular_expressions.htm).

Beispiel:

// javac DuckFinder.java ; java DuckFinder
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DuckFinder
{
public static void main(String[] args)
{
String line = "Test, Ente, EntE. Wir beobachten ENTE Dich!";
Pattern r = Pattern.compile("EntE\\W+(\\w+)", Pattern.CASE_INSENSITIVE);
Matcher m = r.matcher(line);

while(m.find())
{
System.out.println(m.group(1));
}
}
}
Ausgabe:

EntE
Dich

Ob man Satzeichen mit dabei haben möchte und so lässt sich natürlich leicht einstellen, indem man den RegEx-Ausdruck anpasst.

k34nu
12.03.2016, 18:06
Ich habe jetzt mal was gemacht und soweit funktioniert auch alles, aber jetzt komm ich nicht weiter.
In meinem Beispiel suche ich jetzt im Quellcode nach der div class "Schauspieler", und lass alle Elemente ausgeben die darinstehen.
Ich weis aber nicht wie ich es jetzt mache, nur die Schauspieler aufzulisten.

Hier ist die Stelle aus dem Quellcode mit den Schauspielern:

</ul>
<div class='h3'>Schauspieler</div>
<ul>
<li itemtype='http://schema.org/Person'>
<div class='img_portrait_box'>
<div class='fallback_image'>
<a class="ga-onclick" data-ga-onclick="trackEvent:/movie/cast_and_crew/image" title="Keanu Reeves" href="/people/keanu-reeves (https://free-hack.com/view-source:http://www.moviepilot.de/people/keanu-reeves)"><img src="http://assets.cdn.moviepilot.de/files/e224965bd36adc851c101b02a79d033e2c01f86e3775585c20 6c06a898d3/fill/48/67/Keanu_Reeves.jpg (https://free-hack.com/view-source:http://assets.cdn.moviepilot.de/files/e224965bd36adc851c101b02a79d033e2c01f86e3775585c20 6c06a898d3/fill/48/67/Keanu_Reeves.jpg)" alt="Keanu reeves" /></a>
</div>
</div>
</li>

Hier mein Code:
import java.net.URL;
import java.util.Scanner;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MainClass {

public static void main(String[] args) {
String[] urls = {
"http://www.moviepilot.de/movies/speed-3",

};

for (String string : urls) {
Scanner scanner = null;
try {
scanner = new Scanner(new URL(string).openStream(), "UTF-8");
String out = scanner.useDelimiter("\\A").next();
Document document = Jsoup.parse(out);
Element element = document.getElementByClassName("Schauspieler");

Elements allElements = element.children();
for (Element e : allElements) {
System.out.println(e);
}

} catch (Exception e) {


e.printStackTrace();
}
finally{
if(scanner!=null)
scanner.close();
}
}
}
}



Ich hab mir überlegt "einfach" nach
"<h5 itemprop='actor'>" suchen zu lassen und dann den Inhalt von "title="Keanu Reeves"
rausschreiben.
Aber ich weis nicht wie ich das jetzt umsetze, vielleicht kann mir da jemand weiter helfen.
Danke im voraus

Edit: Das Programm muss nicht effizient sein:)

Cystasy
12.03.2016, 18:27
Too much Text

Kann dir höchstens mal zeigen wie ich es in Javascript löse bei soetwas.. ist aber nicht wirklich effektiv / effizient:



/*
Slice a String out of a Text
*/
function SliceText(txt, a, b, num)
{
var tmp = txt.split(a);
tmp=tmp[1+num];
tmp = tmp.split(b);
tmp = tmp[0];
return tmp;
}



Damit kann man Abschnitte aus einem Text rausschneiden.
Beispielweise wenn du "Mein Name ist Hans!" als Text hast und du nun den Name dort rausschnippeln wollen würdest, würdest du das mit dem Aufruf



SliceText("Mein Name ist Hans!","ist ","!",0);


erreichen.. die Funktion gibt dir dann "Hans" zurück.

Nicht effizient, und wahrscheinlich steigen mir jetzt auch ein paar Leute aufn Kopf dafür.. aber hey - du hast nach Hilfe gefragt.. vielleicht hilfts dir.
Auch wenns nicht wirklich ein guter Weg dafür ist denke ich^^
Musst den Code halt auf Java umschreiben, sollte aber ziemlich leicht sein.

grüße

k34nu
12.03.2016, 18:33
hm komisch, dass der Text zu lang ist, ich hab ihn jetzt mal gekürzt, vielleicht sieht man nun alles.
Aber Danke schonmal für das Beispiel.

Cystasy
12.03.2016, 18:40
hm komisch, dass der Text zu lang ist, ich hab ihn jetzt mal gekürzt, vielleicht sieht man nun alles.
Aber Danke schonmal für das Beispiel.

Der ist nicht zu lang, ich habs nur editiert damit es kein Fullquote wird^^
Fullquotes mit Code werden hier nicht gern gesehen, sorry für die verwirrung :D

k34nu
12.03.2016, 18:41
Achsoo, ok kein Problem:D
Dachte der Text wurde bei dir nicht angezeigt weil er zu lang wär^^

R3s1stanc3
13.03.2016, 01:57
Eine schönere Lösung wäre, die Seite als HTMLDocument (https://docs.oracle.com/javase/7/docs/api/javax/swing/text/html/HTMLDocument.html) zu laden und dir damit dein img Tag raus zu suchen. So wäre das Ganze später auch einfacher anzupassen auf andere Webseiten oder sollte moviepilot mal seine html struktur ändern

Cystasy
13.03.2016, 02:49
Eine schönere Lösung wäre, die Seite als HTMLDocument (https://docs.oracle.com/javase/7/docs/api/javax/swing/text/html/HTMLDocument.html) zu laden und dir damit dein img Tag raus zu suchen. So wäre das Ganze später auch einfacher anzupassen auf andere Webseiten oder sollte moviepilot mal seine html struktur ändern

Gibt es bei einem HTMLDocument auch eine ähnliche Zugriffsebene wie z.b DOM (beispiel: document.body.getElementById('meh') o.ä) ?
Weil dann wäre es wirklich eine enorm bessere Lösung die man vorziehen sollte.