Pattern bzw. Regex HTML-Code

Reality

Top Contributor
Hi,
ich versuche über ein Pattern bestimmten HTML-Code herauszulesen, nur wird leider gar nichts gefunden.



Java:
Scanner in = new Scanner(new FileReader(file));

while (in.hasNext("<h2 class=\"im_text\">.*?</h2>") ) {
         sb.append(in.next("<h2 class=\"im_text\">.*?</h2>"));

         System.out.println(sb.toString());
}

Hat jemand eine Idee, wo der Fehler ist? Danke im Voraus!

Liebe Grüße
Reality
 
Zuletzt bearbeitet von einem Moderator:
Naja hasNext schaut ob das nächste Token passt..der von dir gesuchte Code steht doch aber sicherlich irgendwo in dem HTML oder nicht? Und was willst du mit dem in.next erreichen? Du willst doch vermutlich das herausziehen was jetzt innerhalb des Tags steht oder? Also in .*? <-- ?! Mache ne Gruppe draus und benutze in.match() mit findWithinHorizon !

Also in etwa
Java:
		while (in.findWithinHorizon("<h2 class=\"im_text\">(.*?)</h2>", 0) != null) {
			sb.append(in.match().group(1));
		}
 
@Reality
von einem File zu schreiben und keine Zeile als Testfall hier ins Forum zu posten zeugt schon von bedenklicher Intelligenz,
so muss man es leider mal sagen

".*?" ist ansonsten noch ein nie zu verwendendes Pattern, was soll das deiner Ansicht nach leisten?

-----

nach kurzem Test vermute ich, dass Scanner wie üblich die Token bei Leerzeichen trennt und diese per Pattern nur einzeln abfragbar sind:
Java:
public class Test {
    public static void main(String[] args)  {
        Scanner in = new Scanner("<h2 h2>");
        StringBuilder sb = new StringBuilder();
        while (in.hasNext("<h2 h2>"))  {
            sb.append(in.next("<h2 h2>"));
            System.out.println("doppelt: " + sb.toString());
        }
        while (in.hasNext("<?h2>?"))   {
            sb.append(in.next("<?h2>?"));
            System.out.println("einzeln: " + sb.toString());
        }
    }
}
edit: ah, gibt ja noch bessere Methoden
 
@Basti: Danke, super Code! 🙂

@SlaterB: Antworte am Besten gar nicht, wenn du weißt, dass du persönlich und unfreundlich wirst. Es ist noch kein Meister vom Himmel gefallen und ich habe schon ganz andere Fälle im Leben gesehen ohne persönlich zu werden...

L. G.
Reality
 
Hi,
ich bin's nochmal. 😉

Habe nun ein komplexeres Problem:

Ich hätte gerne den Text zwischen zwei Überschriften herausgefiltet, die in dieser Form vorhanden sind:

[XML]<p class="x-berschrift1">Überschrift 1</p>
...
Jede Menge Text... <!-- Das hätte ich gerne extrahiert -->
...
<p class="x-berschrift1">Überschrift 2</p>[/XML]

Mein Versuch:

Java:
        Pattern pattern = Pattern.compile("<p class=\"x-berschrift1\">(.*?)</p>(.*?)<p class=\"x-berschrift1\">(.*?)");

        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            try{
                Scanner in = new Scanner(new FileReader(file));

                while (in.findWithinHorizon(pattern, 0) != null) {
                    System.out.println(in.match().group(2));
                }
            } catch (FileNotFoundException e) {
                System.err.println(e.toString());
            }
        }

Bei dem Code wird aber leider nichts ausgegeben. Wo liegt der Fehler?

Danke, im Voraus!

L. G.
Reality
 
Folgender Code ändert leider nichts 🙁 :

Java:
Pattern pattern = Pattern.compile("<p class=\"x-berschrift1\">(.*?)</p>(.*?)<p class=\"x-berschrift1\">(.*?)", Pattern.MULTILINE);
 
wenn mir zu schreiben erlaubt wäre hätte ich dir die Lösung schon vor einer Stunde sagen können,
so aber zumindest ein Hinweis: schau dir die Beschreibungen bei MULTILINE und anderen Flags an,
MULTILINE ist leider wenig hilfreich, ein anderer schon..
 
Unglaublich welchen Unterschied ein Flag machen kann. DOTALL hat weiter geholfen. Danke an SlaterB. 😉

Liebe Grüße
Reality
 
DOTALL bewirkt ja, dass . auch Zeilenumbrüche "annimt", was er standardmäßig nicht tut, daher ist es auch klar das so ein Flag in deinem Fall "so viel" bewirkt 🙂

Müsste es aber nicht eher so sein ?:
Java:
Pattern pattern = Pattern.compile("(?s).*?<p class=\"x-berschrift1\">.*?</p>(.*?)<p class=\"x-berschrift1\">.*?</p>");

Ich bin mir nicht sicher ob es bei dir nicht eventuell zu Problemem kommt, wenn du mehrere Texte zwischen mehreren Überschriften "rausfiltern" wolltest.

Ps. Ich habe die anderen .*? nicht gruppiert, da du sie in deinem Beispielcode nicht benutzt, und somit nur unnötige Informationen "speicherst". Wenn du sie aber doch verwendest, dann gehören die () natürlich dahin (außer der letzten Gruppe, wo du (.*?) hast, aber nichts mehr dahinter, obwohl da ein </p> hingehört. Ist ganz gefährlich. Das .*? kann dir dann den ganzen Text bis zum Schluss "auffressen" 😛
 
Zuletzt bearbeitet:
DOTALL bewirkt ja, dass . auch Zeilenumbrüche "annimt", was er standardmäßig nicht tut, daher ist es auch klar das so ein Flag in deinem Fall "so viel" bewirkt 🙂
Jo, vielleicht hätte ich auch vorher das hier lesen sollen:

Pattern (Java 2 Platform SE 5.0)

Aber, wenn man bei einer Sache noch am Anfang steht, weiß man noch nicht so genau, wo man anfangen soll und deswegen kann man auch solche essentielle Dinge übersehen. 😉

Müsste es aber nicht eher so sein ?:
Hmm, meine Version macht bei mehreren Überschriften und Texten auch keine Probleme.

Ps. Ich habe die anderen .*? nicht gruppiert, da du sie in deinem Beispielcode nicht benutzt, und somit nur unnötige Informationen "speicherst". Wenn du sie aber doch verwendest, dann gehören die () natürlich dahin (außer der letzten Gruppe, wo du (.*?) hast, aber nichts mehr dahinter, obwohl da ein </p> hingehört. Ist ganz gefährlich. Das .*? kann dir dann den ganzen Text bis zum Schluss "auffressen" 😛
Wichtige Information, danke! 🙂

Liebe Grüße
Reality
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben