Hi.
Ich versuche eine Webseite mit folgendem Code zu parsen.
Dabei wird zwar das für mich interessante Tag erkannt; jedoch nicht alle Attribute für dieses Tag.(z.B. title) Stattdessen werden viele Fehlermeldungen ausgegeben!
(in
wird nur das interessante Tag ausgegeben)
Die gesamte Ausgabe des Programmes habe ich als Anhang beigefügt!
Für mich stellen sich im Augenblick zwei Fragen:
Wie ich die Parsingfehler beheben kann?
Wieso werden nicht alle Attribute erkannte und wie kann ich das verbessern?
Vielen Dank schon mal für Eure Hilfe
Rainer
Ich versuche eine Webseite mit folgendem Code zu parsen.
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Collections;
import javax.swing.text.AttributeSet;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTML.Tag;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
public final class HTMLscanner extends HTMLEditorKit.ParserCallback {
private static final HTMLscanner SCANNER = new HTMLscanner();
/** Private constructor requested by checkstyle. */
private HTMLscanner() { }
/**
* @param t is the found tag
* @param a are the attributes for the tag
* @param pos in the stream(in characters)
* @see javax.swing.text.html.HTMLEditorKit.ParserCallback#handleStartTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet, int)
*/
@Override
public void handleStartTag(final Tag t, final MutableAttributeSet a, final int pos) {
System.out.println(String.format("handleStartTag: tag=%s, attributes=%s, pos=%s", t, a, Integer.valueOf(pos)));
if (a.toString().contains("href=http://img.geocaching.com/cache/large")) {
System.out.println(String.format("tag=%s", t));
for (final Object obj : Collections.list(a.getAttributeNames())) {
System.out.println(String.format("\tattr=%s, value=%s", obj, a.getAttribute(obj)));
}
}
super.handleStartTag(t, a, pos);
}
/**
* @see javax.swing.text.html.HTMLEditorKit.ParserCallback#handleEndTag(javax.swing.text.html.HTML.Tag, int)
*/
@Override
public void handleEndTag(final Tag t, final int pos) {
System.out.println(String.format("handleEndTag: tag=%s, pos=%s", t, Integer.valueOf(pos)));
super.handleEndTag(t, pos);
}
/**
* @param errorMsg
* @param pos
* @see javax.swing.text.html.HTMLEditorKit.ParserCallback#handleError(java.lang.String, int)
*/
@Override
public void handleError(final String errorMsg, final int pos) {
System.out.println(String.format("handleError: %s: %s", errorMsg, Integer.valueOf(pos)));
super.handleError(errorMsg, pos);
}
/**
* Start point for the application.
* @param args are the command line arguments
*/
public static void main(final String[] args) {
final String name = "http://www.geocaching.com/seek/cache_details.aspx?wp=GC3JAKN";
System.out.println(String.format("scanning %s", name));
try {
final URL url = new URL(name);
final URLConnection connection = url.openConnection();
final InputStream is = connection.getInputStream();
final InputStreamReader isr = new InputStreamReader(is);
final BufferedReader br = new BufferedReader(isr);
final HTMLEditorKit htmlKit = new HTMLEditorKit();
final HTMLDocument htmlDoc = (HTMLDocument) htmlKit.createDefaultDocument();
final HTMLEditorKit.Parser parser = new ParserDelegator();
final HTMLEditorKit.ParserCallback callback = SCANNER;
parser.parse(br, callback, true);
for (final HTMLDocument.Iterator iterator = htmlDoc.getIterator(HTML.Tag.A);
iterator.isValid();
iterator.next()) {
final AttributeSet attributes = iterator.getAttributes();
final String srcString = (String) attributes.getAttribute(HTML.Attribute.HREF);
System.out.println(srcString);
}
} catch (final IOException exception) {
exception.printStackTrace(System.out);
}
}
}
Dabei wird zwar das für mich interessante Tag erkannt; jedoch nicht alle Attribute für dieses Tag.(z.B. title) Stattdessen werden viele Fehlermeldungen ausgegeben!
(in
Java:
handleStartTag()
Die gesamte Ausgabe des Programmes habe ich als Anhang beigefügt!
Für mich stellen sich im Augenblick zwei Fragen:
Wie ich die Parsingfehler beheben kann?
Wieso werden nicht alle Attribute erkannte und wie kann ich das verbessern?
Vielen Dank schon mal für Eure Hilfe
Rainer