HTML Parsing errors

hirsra

Aktives Mitglied
Hi.

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()
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
 

Anhänge

  • ausgabe.zip
    13,6 KB · Aufrufe: 3

Marco13

Top Contributor
Du selbst kannst da nicht viel machen, was NICHT mit "Neuschreiben eines Parsers" zu tun hat. Es ist nunmal so, dass praktisch ALLE Webseiten im strengsten Sinne "fehlerhaft" sind. Da gibt es öffnende Tags, die nicht geschlossen werden, ungültige Tags, veraltete Elemente... Abgesehen davon ist dieses "HTMLEditorKit.ParserCallback" Zeux ein Krampf, damit kann man praktisch nichts anfangen, und das wenige was man machen kann, ist aufwändig. Und selbst WENN man es schafft, etwas rauszulesen: Durch sowas wie
Java:
if (a.toString().contains("href=http://img.geocaching.com/cache/large"))
würde es das Programm schon raushauen, wenn der Seitenbetreiber dort später Leerzeichen [c]href = http..[/c] einfügt ;)

Für alles, was irgendwie mit "HTML Parsen und Interpretieren" zu tun hat, empfehle ich i.a. den Jericho HTML Parser . Der ist gut dokumentiert, es gibt KSKBs zu den gängigsten Aufgaben, und er frißt so ziemlich alles, wo auch nur irgendwo <spitze Klammern> drin vorkommen - natürlich beschwert er sich auch über Fehler, aber das, was lesbar ist, liefert er. Abgesehen davon wäre (falls ich das richtig verstanden habe) das, was du vorhast, hiermit erledigt:
Java:
import java.net.URL;
import java.util.List;

import net.htmlparser.jericho.Config;
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.HTMLElementName;
import net.htmlparser.jericho.LoggerProvider;
import net.htmlparser.jericho.Source;

public class ReadHTML
{
    public static void main(String[] args) throws Exception
    {
        Config.LoggerProvider = LoggerProvider.DISABLED;
        String sourceUrlString = "http://www.geocaching.com/seek/cache_details.aspx?wp=GC3JAKN";
        Source source = new Source(new URL(sourceUrlString));
        List<Element> elementList = source.getAllElements(HTMLElementName.A);
        for (Element element : elementList)
        {
            String href = element.getAttributeValue("href");
            if (href != null)
            {
                if (href.startsWith("http://img.geocaching.com/cache/large"))
                {
                    System.out.println(href);
                }
            }
        }
    }
}
 

hirsra

Aktives Mitglied
Hi,

danke für die schnelle Antwort. Naja, Fehler bei den bemängelten Attributen sehe ich nicht. Allerdings ist meine HTML-Wissen auch nur sehr anfängerhaft.

Dein Code werde ich asap ausprobieren. Dazu muß ich ja allerdings Jericho installieren. Ich hoffe ich schaffe das heute abend, aber ich habe heute und morgen abend noch zwei andere Termine und am Freitag geht's übers Wochenende zum Wandern. Also nicht wundern wenn ich mich erst nächste Woche melde.

Anmerkung zur Hintergrund:
Das Finden des Tags ist erst Teil 1 meines Ziels. Für diesen Tag interessieren mich jetzt speziell die Attribute title und description. (zu dem verlinkten Bild)

Schönen Gruß
Rainer
 

hirsra

Aktives Mitglied
Hi,

leider bin ich mit Jericho auch nicht wirklich weitergekommen da auch Jericho wohl nicht alles erkennt.

Ich versuche jetzt die HTML-Seite direkt einzulesen. Auch dabei gibt es Probleme. Hier erst mal mein Code mit dem ich die HTML-Seite lese.
Java:
package de.rh;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public final class TestScanner {

    public static void main(final String[] args) {

        try {
                int lineNo = 0;

                BufferedReader reader = new BufferedReader(new InputStreamReader(new URL(args[0]).openStream()));
                String line = reader.readLine();

                while (line != null) {
                    ++lineNo;
                        System.out.println(String.format("%s: %s", Integer.valueOf(lineNo), line));
                    line = reader.readLine();
                }
        } catch (final IOException exception) {
            System.out.println(String.format("%s: %s", exception.getClass().getName(), exception.getLocalizedMessage()));
        }
    }

}
Das Testprogramm erwartet als Kommandozeilenparameter die URL von welcher gelesen werden soll. Im folgenden werden folgende Varianten verwendet:
  • "http://www.geocaching.com/seek/cache_details.aspx?wp=GC3JAKN]GC3JAKN"
  • file:/Z:/Projekte.JUNO/SpoilerScanner/GC3JAKN.txt
Als Adresse gebe ich "http://www.geocaching.com/seek/cache_details.aspx?wp=GC3JAKN" an. Als Resultat werden 2139 Zeilen gelesen.

Wenn ich den Sourecode der HTML-Seite als Textdatei abspeichere und mit der Adresse file:/Z:/Projekte.JUNO/SpoilerScanner/GC3JAKN.txt die gespeicherte HTML-Seite einlesen werden 2448 Zeilen eingelesen.

In der Tat ist es so dass die für mich relevanten Zeilen in der ersten Variante nicht gelesen werden!

Kann mir das jemand erklären?

Gruß
Rainer
 

Marco13

Top Contributor
Aus Neugier: Was sind denn die Unterschiede? Kann man die beiden Dateien hier posten (als Anhang) ? Vielleicht hat dann jemand eine Idee...
 

hirsra

Aktives Mitglied
Der Unterschied? Gute Frage.

Einmal lese ich direkt über das Netz, und einmal habe ich die Seite im Browser als HTML-Code abgespeichert. D.h. die Seiten sollten eigentlich gleich sein!!!!
 

Marco13

Top Contributor
Der Server kann unterschiedliche Daten liefern, je nachdem, welcher Client die Anfrage stellt (kenn' mich da nicht so aus, aber mit dem ganzen PHP-Zeux geht ziemlich cranker shit), mal abgesehen von Cookie-Abfragen oder JavaScript, was den HTML-Code zwar im Browser aber nicht bei direktem Download verändern kann, oder oder oder...
 

hirsra

Aktives Mitglied
Das klingt aber gar nicht gut.

Aber es muß doch einen Weg geben direkt auf den Code zuzugreifen der von Browser angezeigt wird wenn man den Sourcecode von diesem anzeigen läßt.

Hat mir keiner ein Beispiel wie ich von der oben angegebenen Adresse die komplette 2448 Zeilen lesen kann?
 

Marco13

Top Contributor
Ich weiß nicht, ob da hier noch jemand was genaures dazu sagen kann... Vielleicht mal einen Therad erstellen, in dem es genau um diese Frage geht (das hat ja nicht mehr direkt mit HTML Parsing zu tun, und mit dem, was da Serverseitig gemacht werden kann, kenne ich mich nicht aus.)
 

jgh

Top Contributor
mmh, also wenn ich deine Code ausführe bekomme ich sowohl im Browser, als auch in der Console exakt 768 Zeilen Code angezeigt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Bookmark HTML Datei einlesen, alle Links erhalten und manche editieren..? (aktuell JSoup) Allgemeine Java-Themen 4
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
I HTML / XHTML Seite nach Excel exportieren. Suche Lib Allgemeine Java-Themen 12
F Kennt ihr eine Library um 2 HTML Seiten zu diffen? Allgemeine Java-Themen 8
K HTMLEditor HTML Text in Rich Text umwandeln Allgemeine Java-Themen 14
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
N Lottowebsite programmieren mittels Java, HTML,.... Allgemeine Java-Themen 7
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
M Html Seite auslesen Allgemeine Java-Themen 16
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
L HTML Formular ausführen Allgemeine Java-Themen 1
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
A Applet in HTML einbinden Allgemeine Java-Themen 1
KeVoZ_ JSoup - HTML Tag entfernen Allgemeine Java-Themen 1
I HTML einer Website auslesen liefert nur head Allgemeine Java-Themen 6
perlenfischer1984 HTML Code decodieren Allgemeine Java-Themen 2
stylegangsta Mehrere html seiten einer Homepage einlesen und als Textdatei ausgeben Allgemeine Java-Themen 14
P HTML Text bearbeiten Allgemeine Java-Themen 1
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
OnDemand String aus html einlesen Allgemeine Java-Themen 2
OnDemand Substring einer HTML Seite will nicht Allgemeine Java-Themen 5
S Applet in html laden; InvocationTargetException,.. nur warum ? Allgemeine Java-Themen 0
R HTML Tabelle durchsuchen Allgemeine Java-Themen 3
L Erste Schritte Eclipse und Lokal funktioniert - in HTML nicht! Allgemeine Java-Themen 2
T Keyword Highlighting in HTML Allgemeine Java-Themen 5
B Best Practice HTML Output Optimal implementieren Allgemeine Java-Themen 3
A jEditorPane Html Datei öffnen (code) Allgemeine Java-Themen 3
Y Applet/Html - Wie Java-Methode aufrufen, die einen Parameter erwartet? Allgemeine Java-Themen 3
P Aktuellen HTML Code auslesen (von JS manipuliert) Allgemeine Java-Themen 3
M HTML-Code von Webseite über Browser oder Console auslesen?? Allgemeine Java-Themen 5
S Robuste Methode um Text von HTML code zu extrahieren..? Allgemeine Java-Themen 6
S Bekomme mit Scanner und URL keine Html-Seite ausgelesen Allgemeine Java-Themen 3
C JEditorPane langsam großes HTML Allgemeine Java-Themen 8
M html aus aktuellem Browserfenster mitlesen lassen Allgemeine Java-Themen 5
T Kann HTML Datei nicht lesen Allgemeine Java-Themen 3
S HTML-Quelltext nach bestimmter Stelle durchsuchen Allgemeine Java-Themen 2
B HTML Tags in Strings umwandeln Allgemeine Java-Themen 4
S BufferedReader/PrintWriter an einer HTML Allgemeine Java-Themen 6
T HTML Tag Position mittels Pattern ermitteln Allgemeine Java-Themen 7
C Attribute aus HTML Tags auslesen Allgemeine Java-Themen 6
M Wicket Html Allgemeine Java-Themen 2
S Fehler beim ausführen des HTML Allgemeine Java-Themen 7
S Fehler Applet-HTML Allgemeine Java-Themen 5
B suchfunktion in html integrieren Allgemeine Java-Themen 3
DEvent Wieso ist Javadoc mit Html Tags? Allgemeine Java-Themen 47
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
B RTF zu HTML Allgemeine Java-Themen 3
S Von HTML-Seite den Titel bekommen Allgemeine Java-Themen 2
M .jar in HTML einbinden Allgemeine Java-Themen 5
H Kleiner HTML Parser (Facharbeit) Allgemeine Java-Themen 11
K iText, HTML Einrückung im Document, aber nicht im Paragraph Allgemeine Java-Themen 3
J Überprüfen ob URL eine HTML Datei referenziert Allgemeine Java-Themen 4
E Zeilenumbruch html Allgemeine Java-Themen 3
J URLs aus HTML Datei extrahieren Allgemeine Java-Themen 2
G Swing JEditorPaneAppender (Output im HTML-Format) Allgemeine Java-Themen 12
W Java Anwendung in HTML Allgemeine Java-Themen 2
M Html Unit Whitespace-Problem Allgemeine Java-Themen 4
J HTML-Sonderzeichen ersetzen Allgemeine Java-Themen 2
M HTML-Websiten verarbeiten Allgemeine Java-Themen 8
A Index Datei aus HTML-Dateien Allgemeine Java-Themen 7
S HTML => DOM - Welcher Parser für meine Zwecke? Allgemeine Java-Themen 3
I HTML Seite laden Allgemeine Java-Themen 6
W Saubere Lösung für das Auslesen einer Html Seite (Mehrsprachigkeit) Allgemeine Java-Themen 5
M String in Html Text umwandeln Allgemeine Java-Themen 2
S Formatierungen aus HTML-Dokument übernehmen und in Word docx schreiben Allgemeine Java-Themen 3
E HTML File mit Umlaute einlesen Allgemeine Java-Themen 8
T HTML Parser Allgemeine Java-Themen 7
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
S Swing mit JEditorPane per HTML auf Bilder in JAR zugreifen. Allgemeine Java-Themen 3
S Regulärer Ausdruck für HTML-Tag Allgemeine Java-Themen 18
H Java Methode zum HTML encodieren/decodieren Allgemeine Java-Themen 2
Daniel_L Bug in Copy-Funktion bei HTML-Editorpane? Allgemeine Java-Themen 4
M JApplet einbinden in HTML Allgemeine Java-Themen 19
F Problem mit regulären Ausdruck in Zusammenhang mit HTML Allgemeine Java-Themen 8
T JavaScript aus HTML im JEditorPane ausführen? Allgemeine Java-Themen 5
S PDF nach HTML oder XML Allgemeine Java-Themen 2
O Tastendrücke in verstecktes HTML-Formular schreiben Allgemeine Java-Themen 4
D Strings von HTML befreien Allgemeine Java-Themen 17
A HTML-Seite aufrufen, drucken und zum Programm zurückkehren Allgemeine Java-Themen 2
E Html tags entfernen optimieren Allgemeine Java-Themen 12
Q API zum Verarbeiten von HTML Allgemeine Java-Themen 4
DerEisteeTrinker PDF mit seiner Formatierung in HTML umwandeln Allgemeine Java-Themen 15
B Java in HTML stellen Allgemeine Java-Themen 11
M id aus HTML (Regex) Allgemeine Java-Themen 7
D HTML mit Java verknüpfen Allgemeine Java-Themen 2
W HTML-Pfad Allgemeine Java-Themen 4
G HTML-Datei einlesen, Plain Text in Textfile speichern Allgemeine Java-Themen 4
A HTML-Seite wieder schließen Allgemeine Java-Themen 2
E JTidy html "hidden" Button drücken Allgemeine Java-Themen 7
faetzminator Regex zur Suche von "value-losen" Attributen in HTML Tags Allgemeine Java-Themen 7
data89 Java und HTML-Seiten mit Bildern - Wie passt das zusammen? Allgemeine Java-Themen 2
C Applet: JFileChooser: PFad an HTML zürückgeben Allgemeine Java-Themen 4
T Webseite (HTML) Parser gesucht Allgemeine Java-Themen 8
Daniel_L RegEx: UBB in HTML konvertieren, Problem Verschachtelung Allgemeine Java-Themen 3
T html Datei in jrxml Datei (JasperReports) umwandeln Allgemeine Java-Themen 6
J Seltsame Exception beim Java Applet einbinden in Html Allgemeine Java-Themen 2
G Import von HTML-Dateien Allgemeine Java-Themen 5
MQue Tidy HTML baum durchlaufen Allgemeine Java-Themen 5
MQue Werte in eine html- Datei schreiben Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben