Teile eines Quellcodes verwenden?

  • Antworten:11
  • Bentwortet
René Brunotte
  • Forum-Beiträge: 6

18.06.2012, 20:28:37 via Website

Ich möchte eine App programmieren, welche den Quellcode einer bestimmten Seite (oder wenn möglich nur einen bestimmten Teil des Quellcodes) ausliest. Der Quellcode soll dann in einer Datenbank abgespeichert werden, sodass er immerwieder abgerufen werden kann.

Kann mir jemand helfen, und mir verraten wie ich einerseits den Quellcode auslesen kann und dann nur einen bestimmten Teil herausfiltern kann der weiter verarbeitet wird?

Vielen Dank im Vorraus!

Antworten
Carsten M.
  • Forum-Beiträge: 33.204

18.06.2012, 20:35:21 via App

Was meinst Du mit "Quellcode einer Seite"?

HTML?
Wenn ja, dann parsen.

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

René Brunotte

Antworten
Carsten M.
  • Forum-Beiträge: 33.204

18.06.2012, 20:56:35 via Website

René Brunotte
Ich meine ich möchte mir aus dem Quellcode dieser Seite http://www.gymnasium-lohmar.org/index.php?option=com_content&view=article&id=704&Itemid=78&klasse=Q1 den Teil mit der Tabelle vom Vertretungsplan selbst rausfischen. Sorry die Info hätte ich vielleicht vorher geben können.
Yep, also Parsen.

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

René Brunotte

Antworten
René Brunotte
  • Forum-Beiträge: 6

18.06.2012, 21:03:07 via Website

Dankeschön :)

Antworten
Rainu
  • Forum-Beiträge: 42

20.06.2012, 11:22:39 via Website

Für das Parsen des HTML-codes kannst du dir die bibliothek jsoup ansehen.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

20.06.2012, 11:37:35 via Website

Oder mit Regular Expressions :)

Hierzu ein interessanter (Anti-)Post, den jeder mal gelesen haben sollte :grin::cold::lol:
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

— geändert am 20.06.2012, 11:37:59

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

20.06.2012, 16:13:11 via Website

Ich bin ein absoluter Fan von Regex bzw. Pattern/Matcher im Android Universum. In fast allen Apps schneide ich mittels Pattern/Matcher Teile aus Webseiten in einer Geschwindigkeit raus das ist unglaublich. Ob das Google POIs im Tankbuch sind oder jetzt die Inhalte von Google Drive in meinen Apps. Die Geschwindigkeit ist der helle Wahnsinn.

Als ich vor ein paar Jahren das erste Mal unter Android vor der Entscheidung stand hatte ich eine ganze Woche nur getestet - Regex hatte damals um Längen gewonnen. Manche Tools hingen damals noch im Konstruktor da waren die Pattern/Matcher schon durch. Ein kleiner "Wehrmutstropfen" - die Dinger sind am schnellsten statisch vorkompiliert.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

20.06.2012, 16:26:55 via Website

Harald Wilhelm
Ich bin ein absoluter Fan von Regex bzw. Pattern/Matcher im Android Universum. In fast allen Apps schneide ich mittels Pattern/Matcher Teile aus Webseiten in einer Geschwindigkeit raus das ist unglaublich.
Absolut! Hab ich auch in allen meinen Apps drin.
Regex sind bei solchen "kleinen Anwendungsfällen" einem vollwertigen Parser wie JSoup sowohl bei Geschwindigkeit, als auch beim Memory-Footprint meilenweit voraus.
Das Lustige ist:
Wenn man sich da einmal eingearbeitet hat und einen "Blick" dafür entwickelt hat, kann man die Regex zu einer vorgegebenen Eingabe quasi runtertippen wie seine eigene Muttersprache :D

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

21.06.2012, 09:01:56 via Website

Rafael K.
Das Lustige ist: Wenn man sich da einmal eingearbeitet hat und einen "Blick" dafür entwickelt hat, kann man die Regex zu einer vorgegebenen Eingabe quasi runtertippen wie seine eigene Muttersprache

Spaßig das Du das auch so siehst. Immer wenn ich etwas rausschneiden muss kopiere ich die betreffende Zeile aus dem Quellcode ...

1<a href="/newsticker/meldung/Projektplanung-per-Internet-1621060.html" title="Projektplanung per Internet">Projektplanung per Internet</a>

... ersetze alle " durch \" ...

1<a href=\"/newsticker/meldung/Projektplanung-per-Internet-1621060.html\" title=\"Projektplanung per Internet\">Projektplanung per Internet</a>

... ersetze alle für mich wichtigen Inhalte durch (.+?) ...

1<a href=\"/(.+?)\" title=\"(.+?)\">(.+?)</a>

... und schmeiße das in das Pattern.

1private static final Pattern patternNews = Pattern.compile("<a href=\"/(.+?)\" title=\"(.+?)\">(.+?)</a>", Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

Jetzt noch die Schleife:

1Matcher matcher = patternNews.matcher(content);
2while (matcher.find()) {
3 //
4 = correctHtmlEntities(StringUtils.defaultString(matcher.group(1)));
5 = StringUtils.defaultString(matcher.group(2));
6 = StringUtils.defaultString(matcher.group(3));
7 //
8}

Das war's.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

21.06.2012, 09:56:30 via Website

Mit den .+? bin ich inzwischen etwas vorsichtig.
Ich nehme da lieber das negierte Endzeichen, also z.B. [^<]+ um bis zum nächsten Tag zu matchen.

Wenn man relativ lange Patterns mit vielen Catching-Groups und eine sehr lange Eingabe hat,
führen die reluctant quantifiers teilweise zu einer Laufzeit die gegen unendlich geht.
Das lustige war halt echt, dass man beim Debugging sehen konnte, dass jeder Match länger braucht und ab Match Nr.X konnte man den Debugger auch 1 Stunden laufen lassen, da kam einfach nichts.

Das einzige was ich gefunden habe, was dieses Verhalten erklären KÖNNTE ist das hier:
http://www.regular-expressions.info/catastrophic.html
ODER
http://swtch.com/~rsc/regexp/regexp1.html

Wirksame Gegenmaßnahmen waren:
- Die Eingabe mit einer EINFACHEN Regex in Chunks splitten und dann auf die einzelnen Teile die komplexe Regex anwenden.
- reluctant quantifiers gegen negierte Endzeichen ersetzen

Nur mal so am Rande, damit man es im Hinterkopf hat, falls man mal aus Versehen eine Regex-Endlosschleife programmiert.
...es ist eben keine Endlosschleife :)

— geändert am 21.06.2012, 09:58:23

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

21.06.2012, 10:53:06 via Website

Hmm, bisher hatte ich keine Probleme - auch keine Performance-Probleme. Ich hatte mal diverse Probleme mit den Klassen (z.B. [0-9], \w, etc.) in den Pattern/Matcher. Deswegen bin ich auf die Reluctant Quantifiers umgestiegen. Das Negieren habe ich früher (Perl, etc.) viel genutzt - keine Ahnung warum ich das nicht mehr verwende...

Danke für den Hinweis.

Antworten