tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
10583
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
    /*
     * Created on 29.04.2005@11:54:21 by Darimont
     *
     * TODO Licence info
     */
    package de.tutorials;
     
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.net.URLConnection;
     
    import javax.swing.text.html.HTML;
    import javax.swing.text.html.HTMLDocument;
    import javax.swing.text.html.HTMLEditorKit;
     
    /**
     * @author Darimont
     * 
     * TODO Explain me
     */
    public class LinkExtractor {
     
        public static void main(String[] args) throws Exception {
     
            URL url = new URL("file:/c:/tutorials.htm");
            URLConnection con = url.openConnection();
     
            BufferedReader br = new BufferedReader(new InputStreamReader(con
                    .getInputStream()));
     
            HTMLEditorKit editorKit = new HTMLEditorKit();
            HTMLDocument htmlDoc = new HTMLDocument();
            htmlDoc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
            editorKit.read(br, htmlDoc, 0);
     
            HTMLDocument.Iterator iter = htmlDoc.getIterator(HTML.Tag.A);
            while (iter.isValid()) {
                System.out.println(iter.getAttributes().getAttribute(
                        HTML.Attribute.HREF));
                iter.next();
            }
     
        }
    }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  2. #2
    Folliot Tutorials.de Gastzugang
    Hallo Tom,
    ein schönes Programmfragment, könntest Du es allerdings um ein paar Erläuterungen für Java Neulinge erweitern?

    Zunächst einmal verstehe ich nicht, warum das Programm bei mir zwar kompiliert aber dann nur eine execption in der Klasse main ausgibt: "Exception in thread "main" java.lang.NoClassDefFoundError: LinkExtractor...

    Ich meine es wird gar keine Datei Klassendatei namens LinkExtractor.class angelegt...

    Wo liegt mein Fehler?

    Vielen Dank für Deine Hilfe, Grüsse Folliot
     

  3. #3
    Flokati Flokati ist offline Rookie
    Registriert seit
    May 2004
    Beiträge
    9

    Wenn ich den Tag von "A" auf etwas anderes zB "P" ändere:
    Code :
    1
    
    HTMLDocument.Iterator iter = htmlDoc.getIterator(HTML.Tag.P);
    erhalte ich nur noch eine "NullPointerException"!
     

  4. #4
    thomas_groetzner thomas_groetzner ist offline Grünschnabel
    Registriert seit
    Jan 2008
    Beiträge
    1
    Hallo,

    das Beispiel funktioniert bei mir für "a href" wunderbar. Wenn ich es aber umstelle auf bspw. "img src" dann wird nichts mehr gefunden.

    Hier mein der minimal modifizierte Code, das Eingabedokument und die Ausgabe:

    Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
        public static void main( String[] args ) throws Exception
        {
            
            URL url = new URL( "file:/c:/tutorials.htm" );
            URLConnection con = url.openConnection();
            
            BufferedReader br = new BufferedReader( new InputStreamReader( con.getInputStream() ) );
            
            HTMLEditorKit editorKit = new HTMLEditorKit();
            HTMLDocument htmlDoc = new HTMLDocument();
            htmlDoc.putProperty( "IgnoreCharsetDirective", Boolean.TRUE );
            editorKit.read( br, htmlDoc, 0 );
            
            {// IMAGES
                HTMLDocument.Iterator iter = htmlDoc.getIterator( HTML.Tag.IMG );
                while( iter.isValid() )
                {
                    System.out.println( "img: " + iter.getAttributes().getAttribute( HTML.Attribute.SRC ) );
                    iter.next();
                }
            }
            
            {// LINKS
                HTMLDocument.Iterator iter = htmlDoc.getIterator( HTML.Tag.A );
                while( iter.isValid() )
                {
                    System.out.println( "a: " + iter.getAttributes().getAttribute( HTML.Attribute.HREF ) );
                    iter.next();
                }
            }
        }

    Eingabedokument (mit 6x a href und 1 x img src):
    HTML-Code:
    <html>
    	<head>
    	</head>
    	<body>
    		<img src="hugo.gif">x</img>
    <a href="bla1"/>
    		<a
    
    
    		href
    
    		=
    
    
    		"bla2"
    
    
    		>XXX</a>
    		<a href="bla3"><p>sdfsdfsdf</p>XX1</a>
    		<p>fhdsfksdhka<b>fdfdfdf</p>
    		<a href="bla4">XXX2</a>
    		<a href="bla5">XXX3</a>
    		<img src="hugo.gif">x</img>
    		dfdsfdfs
    		dfsdf
    		s<a href="bla6">XXX4</a>
    		df
    </body
    </html>
    und hier die Ausgabe ohne IMG:
    Code :
    1
    2
    3
    4
    5
    6
    
    a: bla1
    a: bla2
    a: bla3
    a: bla4
    a: bla5
    a: bla6

    Kann da jemand aufklären warum das für a-Tags geht und für p (wie beim Vorposter) und img dann nicht? Ist doch eigentlich kein Unterschied?

    Ciao
    Thomas Groetzner
     

  5. #5
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    /*
     * Created on 29.04.2005@11:54:21 by Darimont
     *
     * TODO Licence info
     */
    package de.tutorials;
     
    import java.io.FileInputStream;
     
    import javax.swing.text.html.HTML;
    import javax.swing.text.html.HTMLDocument;
    import javax.swing.text.html.HTMLEditorKit;
    import javax.swing.text.html.HTML.Tag;
     
    /**
     * @author Darimont
     * 
     * TODO Explain me
     */
    public class LinkExtractor {
     
        public static void main(String[] args) throws Exception {
            HTMLEditorKit editorKit = new HTMLEditorKit();
            HTMLDocument htmlDoc = new HTMLDocument();
            htmlDoc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
            editorKit.read(new FileInputStream("c:/tutorials.html"), htmlDoc, 0);
            
     
            
            HTMLDocument.Iterator aTagIterator = htmlDoc.getIterator(HTML.Tag.A);
            while (aTagIterator.isValid()) {
                System.out.println(aTagIterator.getAttributes().getAttribute(
                        HTML.Attribute.HREF));
                aTagIterator.next();
            }
            
            HTMLDocument.Iterator imgTagIterator = htmlDoc.getIterator(HTML.Tag.IMG);
            while (imgTagIterator.isValid()) {
                System.out.println(imgTagIterator.getAttributes().getAttribute(
                        HTML.Attribute.SRC));
                imgTagIterator.next();
            }
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    bla1
    bla2
    bla3
    bla4
    bla5
    bla6
    hugo.gif
    hugo.gif

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  6. #6
    thomas_groetzner thomas_groetzner ist offline Grünschnabel
    Registriert seit
    Jan 2008
    Beiträge
    1
    Hallo Tom,

    an dem Code von Dir sind ja nur die ersten Paar Zeilen (Lesen file/Lesen Stream) anders. Übersetzte ich das bei mir kommt auch der Output ohne die img-Tags raus.


    Ich hab aber rausgefunden woran es liegt: das Problem steht und fällt mit der verwendeten JDK-Version. Der von mir gepostete Quellcode (und der von Dir auch) liefert:

    mit j2sdk1.4.2_06 den fehlerhaften Output ohne die img-Tags
    mit j2sdk1.6.0_01 neu übersetzt den korrekten Output incl. der img-Tags!

    Ich hatte mit 1.4.2 nämlich auch keine

    - table
    - div
    - ...

    Tags bekommen (in den Fällen sogar null pointer exception, bei img einen leeren Iterator). Nur die a-Tags gingen komischerweise problemlos. Dann habe ich Eclipse auf 1.6 umgestellt und schon ging es. Schade nur dass ich in meiner Umgebung kein 1.6 verwenden darf. Dann parse ich eben doch selbst mit Regular Expressions.

    Ciao und danke
    Thomas Groetzner
     

  7. #7
    Fulk Fulk ist offline Mitglied Bronze
    Registriert seit
    Jan 2008
    Beiträge
    48
    Ich hätte eine Frage zum HTMLEditorKit bzw. den Quelltexten.

    Ist es auch möglich, sich nicht nur die Attribute (name=..., value=... usw.) von HTML-Tags ausgeben zu lassen, sondern auch das, was dahinter/zwischendrin steht?

    Also aus
    Code :
    1
    
    <div>Hallo Welt!</div>
    würde ich gerne "Hallo Welt!" extrahieren.

    Vielen Dank!
     

  8. #8
    criss criss ist offline Grünschnabel
    Registriert seit
    Nov 2008
    Beiträge
    1
    Zitat Zitat von Fulk Beitrag anzeigen
    Ich hätte eine Frage zum HTMLEditorKit bzw. den Quelltexten.

    Ist es auch möglich, sich nicht nur die Attribute (name=..., value=... usw.) von HTML-Tags ausgeben zu lassen, sondern auch das, was dahinter/zwischendrin steht?

    Also aus
    Code :
    1
    
    <div>Hallo Welt!</div>
    würde ich gerne "Hallo Welt!" extrahieren.

    Vielen Dank!
    Hi,
    ich habe die gleiche Frage wie Du. Hast Du schon eine Lösung für dein Problem?
    Danke. Criss.
     

  9. #9
    pelewee pelewee ist offline Grünschnabel
    Registriert seit
    Oct 2004
    Beiträge
    3
    Zitat:
    Zitat von Fulk http://www.tutorials.de/forum/clear.gif
    Ich hätte eine Frage zum HTMLEditorKit bzw. den Quelltexten.

    Ist es auch möglich, sich nicht nur die Attribute (name=..., value=... usw.) von HTML-Tags ausgeben zu lassen, sondern auch das, was dahinter/zwischendrin steht?

    Also aus
    Code: <div>Hallo Welt!</div>
    würde ich gerne "Hallo Welt!" extrahieren.

    Vielen Dank!


    Hi,
    ich habe die gleiche Frage wie Du. Hast Du schon eine Lösung für dein Problem?
    Danke. Criss.
    Hi. Dazu hätte ich evtl. eine Lösung für euch.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    int length;
    String text;
    HTMLEditorKit editorKit = new HTMLEditorKit(); 
    HTMLDocument htmlDoc = new HTMLDocument();
     
    htmlDoc.putProperty("IgnoreCharsetDirective",Boolean.TRUE);
    editorKit.read(new FileInputStream("c:/tutorials.html"), htmlDoc, 0);
    HTMLDocument.Iterator iter = htmlDoc.getIterator(HTML.Tag.B);
     
            while (iter.isValid()) {
                length = iter.getEndOffset()-iter.getStartOffset();
                text = htmlDoc.getText(iter.getStartOffset(), length);
                System.out.println(text);
                iter.next();
            }
    Hier wollte ich den Text ausgeben der "Fett" geschrieben wurde.
    Mit dem "length = iter.getEndOffset()-iter.getStartOffset();" bekommt ihr eure Satzlänge, die zwischen den Tags <b></b>steht, heraus.
    Nun müsst ihr nur noch "htmlDoc.getText(iter.getStartOffset(), length);" aufrufen.

    Hoffe ich konnte euch weiterhelfen
    Alternativ Lösungen gern gesehen.

    Gruß Mike
    Geändert von pelewee (23.12.08 um 14:46 Uhr)
     

  10. #10
    herzeleid herzeleid ist offline Rookie
    Registriert seit
    Dec 2007
    Beiträge
    6
    Das ganze Funktioniert bei mir leider nur in einer IDE (netBeans / Eclipse), wenn ich das aber in einer Konsole (Linux) starte, bekomme ich irgendwann immer eine EOFException...

    Die ganze Fehlermeldung:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    couldn't parse: 0 6px
    couldn't parse: 0 24px 0 6px
    couldn't parse: 0 6px 0 24px
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Implement parseAny for FUNCTION
    Exception in thread "main" java.lang.reflect.InvocationTargetException
       at java.lang.reflect.Method.invoke(libgcj.so.90)
       at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
    Caused by: gnu.javax.swing.text.html.parser.support.low.ParseException: IO Exception
       at gnu.javax.swing.text.html.parser.support.low.ReaderTokenizer.getTokenAhead(libgcj.so.90)
       at gnu.javax.swing.text.html.parser.support.Parser.error(libgcj.so.90)
       at gnu.javax.swing.text.html.parser.support.Parser.error(libgcj.so.90)
       at gnu.javax.swing.text.html.parser.support.Parser.parse(libgcj.so.90)
       at gnu.javax.swing.text.html.parser.GnuParserDelegator.parse(libgcj.so.90)
       at javax.swing.text.html.HTMLEditorKit.read(libgcj.so.90)
       at SEOSearch.getBacklinkSites(SEOSearch.java:85)
       at SEOSearch.main(SEOSearch.java:132)
       at java.lang.reflect.Method.invoke(libgcj.so.90)
       ...1 more
    Caused by: java.io.EOFException: Early EOF in GZIP footer
       at java.util.zip.GZIPInputStream.readFooter(libgcj.so.90)
       at java.util.zip.GZIPInputStream.read(libgcj.so.90)
       at java.io.BufferedInputStream.refill(libgcj.so.90)
       at java.io.InputStreamReader.refill(libgcj.so.90)
       at java.io.InputStreamReader.read(libgcj.so.90)
       at java.io.BufferedReader.fill(libgcj.so.90)
       at java.io.BufferedReader.read(libgcj.so.90)
       at gnu.javax.swing.text.html.parser.support.low.ReaderTokenizer.readToken(libgcj.so.90)
       at gnu.javax.swing.text.html.parser.support.low.ReaderTokenizer.read(libgcj.so.90)
       at gnu.javax.swing.text.html.parser.support.low.ReaderTokenizer.getTokenAhead(libgcj.so.90)

    Hintergrund warum ich sowas eigentlich brauche ist der, das ich für meinen Job ein Tool schreiben soll, mit dem man verschiedene Seiten nach einem definierten Link durchsucht.

    Wenn jemand meint, die Idee das über den HTMLEditorKit ohne Swing zu machen sei suboptimal, wie könnte man das evtl. anders machen?
    Seite zeilenweise streamen und dann innerhalb der Zeilen nach dem Link suchen?

    Danke im Voraus für evtl. Antworten.
     

  11. #11
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    lass die Anwendung mal mit einer normalen JVM laufen und nicht mit gcj...

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  12. #12
    herzeleid herzeleid ist offline Rookie
    Registriert seit
    Dec 2007
    Beiträge
    6
    hmpf...ok, ich gleb mir heute das Blind-Flag an die Stirn....

    DANKE
     

  13. #13
    Onkel Dirk Tutorials.de Gastzugang
    Hallo,

    ich lese immer fleißig mit, habe aber auch noch eine Frage.

    Wie kann ich den herausfinden ob der Link noch Attribute rel="nofollow" oder styles hat?

    Und gibt es eine leicht verständliche Anleitung vom HTMLEditorKit für Anfänger wie mich?

    Gruß

    Onkel Dirk
     

Ähnliche Themen

  1. Anzahl bestimmter Elemente eines Dokuments
    Von Arndtinho im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 19.07.07, 08:17
  2. Inhalt eines Dokuments verschicken (mit Formatierung)
    Von XsilentX im Forum .NET Web und Kommunikation
    Antworten: 6
    Letzter Beitrag: 24.03.06, 14:48
  3. Mit Delphiprogramm alle Links aus einer HTML-Datei auselen, wie?
    Von radar im Forum Delphi, Kylix, Pascal
    Antworten: 0
    Letzter Beitrag: 19.12.04, 22:16
  4. Druck eines pdf-Dokuments
    Von nikek im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 24.06.04, 09:28
  5. Antworten: 6
    Letzter Beitrag: 13.03.02, 08:41