Best Practice Ideensuche: Flexibel hinzufügbare eigene Parser

Hutmacher

Bekanntes Mitglied
Ich möchte ein Programm schreiben, das unter anderem die Funktionalität bietet, Webseiten zu parsen und Downloadlinks rauszusuchen. Das ist in Java natürlich ohne Problem möglich - das Problem ist Folgendes:
Für eine Hand voll Webseiten könnte ich den Parser direkt in Java schreiben. Allerdings kann ich ja kaum für alle Webseiten selbst einen Parser schreiben, und so möchte ich, dass User ihren eigenen Parser schreiben und zur Laufzeit laden können (möglichst, indem sie einfach nur in einem bestimmten Ordner eine Script-Datei o.Ä. ablegen).

1. Idee:
Der User schreibt selbst eine Parser-Klasse (z.B. mit einer Methode, die alle gewünschen Links zurückgibt) in Java und packt einfach die .class-Datei in einen Ordner. Das ist allerdings umständlich für den User (und womöglich bringt es einige sicherheitsrelevanten Risiken mit sich, aber dafür gibt's ja den Security Manager).

2. Idee
Der User schreibt ein kleines Script in einer Skriptsprache wie z.B. JavaScript oder Ruby, welches ich dann per Rhino-Engine etc. ausführen kann. Dies ist komfortabel, allerdings muss die Sprache einen HTML-Parser bereistellen bzw. es muss sich portabel eine Bibliothek dafür einbinden lassen.

Wie kann ich mein Vorhaben am sinnvollsten umsetzen?
 
Zuletzt bearbeitet:

turtle

Top Contributor
Allerdings kann ich ja kaum für alle Webseiten selbst einen Parser schreiben
Das verstehe ich nicht???:L

Wie macht es denn ein Browser???
Der wird ja auch nicht für einige Webseiten ein Parser beigesteuert, damit die Website geparsed und angezeigt werden kann.
 

Hutmacher

Bekanntes Mitglied
Okay, habe ich unverständlich ausgedrückt und das Wort Parser synonym zu "Downloadlink-Sammler" gebraucht, das war natürlich etwas verwirrend^^ Ich kann den ersten Beitrag leider nicht editieren, daher mal ein neuer Erklärungsversuch:

Besserer Erklärungsversuch:
-----------------------------------------
Ich möchte ein Programm schreiben, das unter anderem die Funktionalität bietet, aus Webseiten bestimmte Links rauszusuchen. Das ist in Java natürlich ohne Problem möglich - das Problem ist Folgendes:
Für eine Hand voll Webseiten könnte ich den Link-Sucher direkt in Java schreiben. Allerdings kann ich ja kaum für alle Webseiten selbst einen Link-Sucher schreiben, und so möchte ich, dass User ihren eigenen Link-Sucher schreiben und zur Laufzeit laden können (möglichst, indem sie einfach nur in einem bestimmten Ordner eine Script-Datei o.Ä. ablegen).

Beispiel:
Für java-forum.org könnte ich einen Link-Sammler schreiben, der die Links zu allen Themen auf der Hauptseite sammelt. Das könnte ich auch für das Forum von bytewelt.de tun. Nun möchte ein Nutzer aber auch die Links für alle Java-Themen auf stackoverflow.com oder irgendeiner anderen Seite haben. Nun soll er sich einen eigenen Link-Sammler schreiben können, den mein Programm zur Laufzeit laden kann (der Link-Sammler benutzt dann intern einen HTML-Parser, um sich nicht mit regulären Ausdrücken auf den Seitenquelltext plagen zu müssen).

1. Idee:
Der User schreibt selbst eine Link-Sammler-Klasse (z.B. mit einer Methode, die alle gewünschen Links zurückgibt) in Java und packt einfach die .class-Datei in einen Ordner. Das ist allerdings umständlich für den User (und womöglich bringt es einige sicherheitsrelevanten Risiken mit sich, aber dafür gibt's ja den Security Manager).

2. Idee:
Der User schreibt ein kleines Script in einer Skriptsprache wie z.B. JavaScript oder Ruby, welches ich dann per Rhino-Engine etc. ausführen kann. Dies ist komfortabel, allerdings muss die Sprache einen HTML-Parser bereitstellen bzw. es muss sich portabel eine Bibliothek dafür einbinden lassen.

Wie kann ich mein Vorhaben am sinnvollsten umsetzen?
-----------------------------------------
 
Zuletzt bearbeitet:

turtle

Top Contributor
Ich verstehe es immer noch nicht. Hier mal meine kleine Crawl-Demo. URL to crawl ist Aufrufparameter
i
Java:
mport java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;

public class Crawl {

    public static void main(String[] args) throws IOException {
	URL url = new URL(args[0]);
	URLConnection connection = url.openConnection();
	InputStream inputStream = connection.getInputStream();
	Reader reader = new InputStreamReader((InputStream) connection.getInputStream());
	new ParserDelegator().parse(reader, new Page(), true);
    }
}

class Page extends HTMLEditorKit.ParserCallback {

    public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
	if (t == HTML.Tag.A) {
	    String link = null;
	    Enumeration<?> attributeNames = a.getAttributeNames();
	    if (attributeNames.nextElement().equals(HTML.Attribute.HREF))
		link = a.getAttribute(HTML.Attribute.HREF).toString();
	    System.out.println(link);
	}
    }
}
 

Hutmacher

Bekanntes Mitglied
Danke, dass du dir die Mühe gemacht hast, und diesen Code geschrieben hast :) Das ist aber nicht das, wonach ich suche. Aber ich versuche mal, meine Erklärungen auf deinem Code aufzubauen.

Der Code, den du mir gepostet hast, holt sich alle Links auf einer Webseite bzw. gibt sie aus. Wenn man ihn z.B. auf java-forum.org ausführen würde, würden alle Links ausgegeben werden. Angenommen, ich möchte nun aber nicht alle Links, sondern nur alle Links von Unterforen (nur ein Beispiel!), also bspw. "Java Basics - Anfänger-Themen", "Allgemeine Java-Themen", "AWT, Swing, JavaFX & SWT", etc. haben. Dann müsste ich deinen oben geschrieben Code abändern und die Links nur von bestimmten Stellen entnehmen. Ich würde mich also durch den DOM-Tree hangeln müssen, um zu suchen, was ich finde. Ich müsste also einen spezifischen Link-Sammel-Algorithmus für java-forum.org programmieren müssen.

Wenn ich nun auch noch alle Unterforen-Links von bytewelt.de haben wollte, könnte ich ja nicht einfach den gleichen Algorithmus verwenden - der Seitenaufbau ist ja ganz anders. Ich müsste also an anderen Stellen im DOM-Tree nachgucken müssen und einen spezifischen Link-Sammel-Algorithmus für bytewelt.de programmieren müssen.

Dem Nutzer meines Programmes reicht es aber nicht, nur die Unterforen-Links von java-forum.org und bytewelt.de zu haben. Er möchte auch Unterforen-Links von stackoverflow.com, c-plusplus.de und noch anderen Seiten haben. Er könnte mir jetzt eine E-Mail schreiben "Hey, implementier doch mal 'nen Link-Sammler für stackoverflow.com, für c-plusplus.de, etc. der alle Links für Unterforen sammelt" und auf die nächste Version meines Programms warten. Das kann ich natürlich zeittechnisch nicht alles selbst machen. Deswegen soll der Nutzer sich einen eigenen Link-Sammler schreiben können, den mein Programm dann einfach lädt. Und dann schreibt er sich halt 'nen Link-Sammler für o.g. Seiten, die natürlich alle spezifische Algorithmen brauchen, weil die Seiten alle anders aufgebaut sind.

Aber wie mache ich es dem User am einfachsten, das zu tun? Wäre es z.B. eine gute Idee, dass der Nutzer Scripts in JavaScript (oder Ruby, etc.) schreibt, in denen er seinen gewünschten Link-Sammler für Seite x implementiert? (siehe Idee 1 und Idee 2 im vorigen Beitrag)
 
Zuletzt bearbeitet:

Hutmacher

Bekanntes Mitglied
Okay, wir reden komplett aneinander vorbei :D Bitte lies dir nochmal meinen vorigen Beitrag durch, ich suche eine Antwort auf die Frage am Ende :)
 

Neue Themen


Oben