Problem mit createReplaceDescriptor

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Problem mit createReplaceDescriptor

Re: Problem mit createReplaceDescriptor

von marcel_at_work » Do, 24.06.2010 20:41

... keiner einen Rat???

Lg

Re: Problem mit createReplaceDescriptor

von marcel_at_work » Mi, 23.06.2010 19:25

Nochmal ne Frage...

... wenn ich ne ganz normale URL mit "www..." parse, klappt das ja so wie ich mag... aber zum Beispiel bei "http://de2.netpure.de/cgi-bin/baseporta ... ahren/main" LÄDT er die Datei NICHT einmal in den Speicher... das "http:"-Format/bzw. das fehlende "www." will er irgendwie nicht (Bemerkung: diese eine Seite ist nur über "http:..." zu erreichen, ansonsten bekomme ich einen Gerätefehler). Vl. ne Ahnung, wo da das Problem liegen könnte???

Lg, Marci

Re: Problem mit createReplaceDescriptor

von marcel_at_work » Mi, 23.06.2010 18:58

Hey, mein Freundchen ;-)

... willst du etwa meinen tollen Lösungsweg verunglimpfen? :lol:

Warum einfach, wenn´s auch schwer geht?! Aber du hast absolut Recht, es funzt. Und zwar auch ganz ohne diese doofe ODER-Verknüpfung. Dank dir! :)

Tja... obwohl ich in Mathe stets auf 1 stand, hatte ich Funktionsgleichungen das letzte Mal in der 10. Klasse... schon etwas her... :shock:

Ich hab noch ein bisschen Probleme mit der Funktionsweise von einigen regulären Ausdrücken... dennoch hatte ich ja deine Idee ausprobiert, aber ohne Erfolg. Frag ned warum. Es geht ja jetzt! :)

GlG, Marci

Re: Problem mit createReplaceDescriptor

von DPunch » Mo, 21.06.2010 22:58

Aloha
marcel_at_work hat geschrieben:... aber mal im Ernst, auf sowas Verwirrendes: ((\n)*|.*)* ... muß man erstmal kommen!?
Darauf muss man tatsächlich erstmal kommen ;)
Ist nämlich doch etwas umständlich, das sollte meinem Verständnis nach auch per "<body(\n|.)*body>" funktionieren.
Wenn Du das mal übersetzt:
"<body" suchen
danach kann entweder ein Zeilenumbruch oder ein beliebiges Zeichen folgen, und zwar 0 bis unendlich mal.
Abgeschlossen mit
"body>"

Das einzige Problem bei der ganzen Sache ist ja eigentlich nur, dass der Zeilenumbruch bei der Verwendung von "." nicht als beliebiges Zeichen erkannt wird, wenn man allerdings ein Zeichen negiert (z.B. mit meinem ersten Vorschlag "[^>]" (=Alle Zeichen, die nicht ">" sind)) dann sind Zeilenumbrüche mit inbegriffen.

Re: Problem mit createReplaceDescriptor

von marcel_at_work » Mo, 21.06.2010 22:49

EDIT:

... um mit dieser "mehrzeiligen Suche" per SearchDescriptor allerdings einen SYSTEMABSTURZ zu vermeiden, sollte man diese AUSSCHLIEßLICH durch eine ODER-Verknüpfung über eine vorangehende "einzeilige Suche" benutzen:
(anscheinend sucht sich OOo sonst TOT, wenn der gesuchte String sich VOR dem ersten Zeilenumbruch befindet :shock: )

SearchDesc.SearchString = "(<body.*</body>)|(<body.*(\n*|.*)*.*</body>)"

GlG, Marci

Re: Problem mit createReplaceDescriptor

von marcel_at_work » Mo, 21.06.2010 22:18

Hallo DPunch,

... mein großer Held. Schön, mal wieder ein Lebenszeichen von dir zu hören. :lol:

Supi... funzt einwandfrei! DANKE!!!

Zwar ging deine Zuweisung nicht, da man beim Suchen anscheinend trotzalledem den Ausdruck "\n" für einen Zeilenumbruch verwenden muß, aber nach einigem hin und her akzeptiert er meinen Wunsch nun über die Benutzung von zwei Referenzen:

SearchDesc.SearchString = "<body.*((\n)*|.*)*.*body>"

... aber mal im Ernst, auf sowas Verwirrendes: ((\n)*|.*)* ... muß man erstmal kommen!? :lol:

Es geht, nun steht dem Aufbau meiner eigenen Google-Krake nichts mehr im Wege! :lol: :lol: :lol:

Liebe Grüße an ALLE

Marci

Re: Problem mit createReplaceDescriptor

von DPunch » Mo, 21.06.2010 18:14

Aloha
marcel_at_work hat geschrieben:Irgendwie will der bei mir nur über EINE suchen, selbst, wenn ich ausdrücklich einen möglichen Zeilenumbruch angebe.
Deine Zeilenumbrüche sind für den SearchDescriptor keine Newlines, sondern Paragraph Marks (Chr(13)).

(Newlines: bei Writer z.B. per Shift+Enter, Paragraph Marks: bei Writer per Enter)
Die Suchroutine von OOo sucht aber jeden Paragraph einzeln ab - sprich: ist der Text durch Paragraph Marks getrennt, wird er nur genau bis zu dieser Marke hinsichtlich der Suchergebnisse analysiert.
Du brauchst also Newlines, die der SearchDescriptor auch als solche erkennt:

Code: Alles auswählen

   While NOT eof(iNumber)
      Line Input #iNumber, sTextzeile
      If sTextzeile <> "" Then
         sQuelltext = sQuelltext & sTextzeile & Chr(10) '############ <--- statt Chr(13)
      End If
   Wend
Danach solltest Du mit \n auch die Zeilenumbrüche erwischen und z.B. so:
SearchDesc.SearchString = "<body[^>]*>"
auch über mehrere Zeilen gehende Ergebnisse erhalten, die zwischen "<body" und dem ersten abschliessenden ">" stehen.

Re: Problem mit createReplaceDescriptor

von marcel_at_work » So, 20.06.2010 22:12

... upps.......................

"Xray ist dein Freund". ;-)

Es war ".String", einfach nur ".String". ;-) Also, wenn man Xray ein paar Mal verwendet hat, kommt man auch langsam hinter dessen Funktionsweise - wie geil. :lol:

Beste Grüße an die Kollegen...

Lg, Marci

EDIT:

Hat jemand zufällig eine Ahnung, wie man mit den regulären Ausdrücken über mehrere Zeilen suchen kann??? Irgendwie will der bei mir nur über EINE suchen, selbst, wenn ich ausdrücklich einen möglichen Zeilenumbruch angebe.

Code: Alles auswählen

SearchDesc.SearchString = "<body" & ".*" & "\n*" & ".*" & ">"
Da kommt bei mir ein leeres Objekt zurück... :(

Re: Problem mit createReplaceDescriptor

von marcel_at_work » So, 20.06.2010 21:53

Hey Winfried, ich bin´s nochmal... ;-)

... ich hab das jetzt mit insertDocumentFromURL gelassen und bin bei der Textzeilen-Implementierung geblieben, da es so zumindest funktioniert.

Ich habe jetzt den Descriptor eingebunden und auch dieser klappt soweit einwandfrei. Ich habe nur das Problem, das ich auch nach längerem Herumsuchen nichts gefunden habe, um auf das Ergebnis zugreifen zu können. Ich habe auch diese "Füllwortliste" von dir zu Rate gezogen, aber dennoch finde ich nicht den richtigen Ansatz: bis auf den Count des Such-Ergebnisses, komme ich leider nicht weiter...

Code: Alles auswählen

...
Dim SearchDesc As Object
Dim FoundDesc
SearchDesc = oTempQuelltext.createSearchDescriptor
SearchDesc.SearchRegularExpression = True
SearchDesc.SearchCaseSensitive = False
SearchDesc.SearchString = "<title>" & ".*" & "</title>"

GlobalScope.BasicLibraries.LoadLibrary("XrayTool")

FoundDesc = oTempQuelltext.findAll(SearchDesc)

xray FoundDesc

msgbox FoundDesc.hasElements
msgbox FoundDesc.getCount()
...
Ich möchte halt irgendwie an die Ergebnismenge (den Inhalt des Meta-Tags "title") von FoundDesc... PLEASE HELP ME......... :(

Lg, Marci

Re: Problem mit createReplaceDescriptor

von marcel_at_work » So, 20.06.2010 20:36

Hmmm...... schön und gut, dass man Dokumente somit auch direkt öffnen kann, aber da gibt´s a kleines Problem: Ich hab mal versuchsweise meine eigene Homepage (.../index.html) geöffnet und die insertDocumentFromURL-Methode hat mir doch glatt genau DAS in das Writer-Dokument geladen, was man auch "online" zuerst sehen sollte (meine Website besteht aus einem einzigen Flashfilm und dieser ist auch das einzige, was ich nun in Writer sehen kann).

Was hat es denn damit auf sich? WO ist der Quelltext? Hab ich noch etwas wichtiges vergessen?

Lg, Marci

Re: Problem mit createReplaceDescriptor

von marcel_at_work » So, 20.06.2010 20:05

Dank dir. ;-)

Lg, Marci

Re: Problem mit createReplaceDescriptor

von komma4 » So, 20.06.2010 19:52

neues Writer-Dokument > insertDocumentFromURL() > SearchDescriptor

geht auch im Hintergrund (DocumentProperties: HIDDEN) und dann wegwerfen, wenn Du es nicht mehr brauchst.

Mit den Suchbegriffen solltest Du hier im Forum Codebeispiele finden

Re: Problem mit createReplaceDescriptor

von marcel_at_work » So, 20.06.2010 19:32

;-)

Jepp, da hast du Recht. Werd´ich mir merken.

Hmmm... das mit dem Writer-Dokument klingt als ne gute Sache. Ich werd´des jetzt auch so lösen. Ich hab grad noch nachgedacht, den String in ein verborgenes Tabellen-Sheet zu laden, aber soweit ich das grad aus der Doku verstanden habe, kann man den Descriptor ausschließlich auf ganze Zellen anwenden, wobei dies mir dann wirklich nicht sehr weit helfen würde.

Wie würdet ihr es denn anstellen, ein textbasiertes Dokument aus dem Web zu laden und zu analysieren? Ist meine Variante dann im Vergleich eher sehr zeitaufwändig?

Lg, Marci

Re: Problem mit createReplaceDescriptor

von komma4 » So, 20.06.2010 19:08

marcel_at_work hat geschrieben:Wie könnt ich das denn anstellen, dass man den Descriptor direkt in dem String anwenden kann?
Der DESCRIPTOR funktioniert nur mit Dokumenten.

Erstelle ein leeres WRITER und setze den String da rein - dann geht's.


Ansonsten meinen Rat: die Fragestellung bitte so umfassend stellen, dass die Antworten auch passen können.
Jürgens Tipp (sheet) erzeugt Dir einen Descriptor, den kannst Du bei einer Stringuntersuchung aber gar nicht verwenden...
Das konnte meine Glaskugel alles nicht zeigen 8)

Re: Problem mit createReplaceDescriptor

von marcel_at_work » So, 20.06.2010 18:31

Hey, ihr zwei,

... hm... Neustart?

Der Descriptor funzt über das Sheet 1a, ist aber leider nicht das wa ich brauche (ich suche NICHT in der Tabelle).

Das Frontier meiner Suchmaschine ist ein Webcrawler, mit dem ich den Inhalt einer URL in ein String-Objekt lade. Und nun möchte ich eben irgendwie mit dem Descriptor auf dieses String-Objekt zugreifen, da meine bisherige Funktion, um die Meta-Angaben zu parsen, schon recht umständlich ist. In der Dokumentation steht, dass dieser sich auf "Dokument-Objekte" bezieht, weshalb ich den Fehler nicht verstehe:

Code: Alles auswählen

Sub webLoading()
	Dim iNumber As Integer
	Dim sTextzeile As String
	iNumber = Freefile
	Open sWebUrl For Input As iNumber
	While NOT eof(iNumber)
	   Line Input #iNumber, sTextzeile
	   If sTextzeile <> "" Then
	      sQuelltext = sQuelltext & sTextzeile & Chr(13)
	   End If
	Wend
	Close #iNumber
	
	Dim replaceDescriptor As Object
	replaceDescriptor = ThisComponent.CreateReplaceDescriptor '< FEHLER
	replaceDescriptor.SearchRegularExpression = True
	replaceDescriptor.SearchString = "^$"
        ...
	
	call webParsing()
End Sub
Wie könnt ich das denn anstellen, dass man den Descriptor direkt in dem String anwenden kann?

Lg, Marci

Nach oben