Announcement

Collapse
No announcement yet.

HTML lesen und parsen--- einfache Frage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • HTML lesen und parsen--- einfache Frage

    Hallo,
    ich bin in der Verlegenheit eine HTML-Datei von einer URL-Adresse aus dem internet lesen zu müssen und festzustellen, welche Hyperlinks darin enthalten sind. Soll heissen, ich muss die HTML-Seite erst aus dem Internet laden und dann nach Hyperlinks durchparsen. DIE HTML-Seite soll NIRGENDS angezeigt werden sondern nur geparst werden.
    Ich habe einige mehr oder weniger aufwendige Lösungen selbst gefunden.
    Meine frage: Weiss jemand einen einfachen Weg um diesen Job zu erledigen ? Am Ende soll eine Liste mit den Adressen der Hyperlinks herauskommen. Bin für jede Hilfe dankbar.

    Grüsse aus Hamburg

    Jürgen

  • #2
    Hi Jürgen,

    hört sich ein bischen nach StringTokenizer an. Nur "a href" ?

    Grüße auch von der Elbe...

    c

    Comment


    • #3
      Hallo Jürgen,<br>
      ich parse HTML files mit dem StreamTokenizer. Das geht sehr gut, <br>
      wenn man nicht auf gute Performance achten muss, da StreamTokenizer<br>
      gemäss einem Java Performance Buch "a severely underoptimzed class" ist.
      <p>
      Klau

      Comment


      • #4
        Hallo,

        für HTML-Parsen gibt es den javax.swing.text.html.HTMLEditorKit.Parser, dem ubergibt man dann einen HTMLEditor.ParserCallBack in der Methode parse(Reader, HTMLEditorKit.ParserCallBack,boolean).
        Von dem ParserCallBack überschreibt man die Methode handleStartTag(HTML.Tag t,MutableAttributeSet,int) .

        HTMLEditorKit.Parser parser= new ParserDelegator();
        Reader r = ...
        ParserCallBack callBack=...
        parser.parse(r,callBack, true);

        class ...extends HTMLEditorKit.ParserCallBack{
        ..
        public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        if(t.equals(HTML.Tag.A)){
        a.getAttribute(HTML.Tag.HREF); //liefert Link
        }
        ..

        Comment


        • #5
          Guten Morgen,
          WOW !!! Gleich 3 Reaktionen, das lob ich mir ;-)
          Also erstmal vielen Dank für Eure Anregungen.

          Thomas: Den String Tokenizer hatte ich als erstes im Auge, ist auch nicht schlecht und tut seinen Dienst relativ performant.

          Klaus: Der StreamTokenizer ist etwas besser vom handling mit dem sowieso vorhandenen InputStream (irgendwoher müssen die Daten ja kommen ;-). Nur sind mir leider die Performanceprobleme dieser Klasse gestern Abend recht schmerzhaft bewusst geworden ;-)

          Hans Christoph: Dein Vorschlag liest sich so schon 'spacig' und clever, und vor allem.... ich kenne diesen Weg noch nicht. Auf den ersten Blick sieht das ganze ganz schön fieselig aus, aber ich werde mal versuchen die Sache zu kapieren.

          Tja, nun gibt es viel zu tun... coden wir es weg.

          Grüsse und nochmals vielen Dank

          Jürge

          Comment


          • #6
            Hi Hans Christoph,
            so, nun sitze ich seit geraumer Zeit über Deiner Lösung und begreife garnichts mehr.

            Also das Erste was schonmal garnicht geht: Es gibt kein HTML.Tag.HREF

            schau mal in die Doku. Javac nimmt mir das Ding so nicht ab.
            Und dann begreife ich nicht was nun was sein soll. Wo bitte sind denn dann am Ende meine Links ? Das ganze mit EditorToolKit, Parser und ParserCallBack bringt mich um den Verstand. Ich kann nicht herausfinden was nun für was zuständig ist.

            Kannst Du für Klarheit sorgen ???

            Gruss

            Jürge

            Comment


            • #7
              Hallo,

              ich habe ein minimal Programm geschrieben (auch ausprobiert):
              <pre>
              import java.io.FileReader;
              import java.io.IOException;
              import javax.swing.text.html.HTMLEditorKit;
              import javax.swing.text.html.HTML;
              import javax.swing.text.html.parser.ParserDelegator;
              import javax.swing.text.MutableAttributeSet;

              class CallBack extends HTMLEditorKit.ParserCallback{

              public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos){
              if(t.equals(HTML.Tag.A)){
              String url=(String)a.getAttribute(HTML.Attribute.HREF);
              System.out.println(url);
              }
              }

              public static void main(String argc[]){
              try{
              ParserDelegator parser= new ParserDelegator();
              FileReader reader=new FileReader(argc[0]);
              CallBack callBack=new CallBack();
              parser.parse(reader,callBack, true);
              }catch(IOException e){
              e.printStackTrace();
              }
              }
              }
              </pre>
              Ich hoffe es hilft Dir weiter.
              Hans-Christop

              Comment


              • #8
                Hi Hans Christoph,
                hat sich erledigt. Habe mir das irgendwie selbst rausgepfriemelt *STOLZBIN*

                Du hattest allerdings oben (erstes Posting) HTML.Tag.HREF geschrieben und eigentlich war es HTML.Attribute.HREF

                Aber nun funkt alles, und dank Deiner hilfe habe ich nun eine richtig smarte Lösung (ich mag sowas ;-).

                Auf weiteres erfolgreiches Coden

                Jürge

                Comment


                • #9
                  Hi all,
                  schliesse mich der Meinung von Jürgen an: HTML parsen mit dem <br>
                  javax.swing.text.html.HTMLEditorKit.Parser ist auf jeden Fall die<br>
                  eleganteste Lösung und die mit dem besten Reuse-Faktor! Über die<br>
                  Performance scheint nichts bekannt, aber ich habe in diesem Thread auch<br>
                  noch nichts Gegenteiliges gehört. Schön, wenn man wieder was dazu<br>
                  lernen kann!
                  <p>
                  Klau

                  Comment


                  • #10
                    Hi Klaus,
                    die Performance könnte nicht besser sein. Also der Parser macht richtig Spass, wenn man ersteinmal das Prinzip der ganzen Sache verstanden hat.
                    Tja, und lernen müssen wir Entwickler doch eh jeden Tag.

                    Also gehen wir's an

                    Jürge

                    Comment

                    Working...
                    X