PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# String durchsuchen



Devil589
06.12.2010, 22:31
Hallo @all,
ich bin gerade dabei zu versuchen einen Quellcode nach etwas bestimmten zu durchsuchen.
Den Quellcode einer Seite habe ich schon als String vorliegen.
Nun versuche ich gerade aus dem String bestimmte Inhalte zu bekommen aber bin am scheitern.
Denn ich möchte z.B. den Inhalt der zwischen 2 Tags steht, z.B.:
<li style="margin-bottom: 1em;margin-left:0px">TESTDATEN</li>
Daraus möchte ich "TESTDATEN" haben.
Ich habe auch schon versucht mit String StartsWith und EndsWith was zu basteln aber leider ohne Erfolg.
Und mit RegEx habe ich es auch schon versucht nur um da etwas richtiges zu basteln habe ich mir gedacht dass es sicherlich einfacher geht in dem man etwas mit der String Klasse macht.

Ich würde mich über Hilfe und Antworten freuen.
Vielen Dank schon mal.

See Ya!

inout
06.12.2010, 22:47
Ganz einfach, mit indexOf den Anfang und das Ende suchen und dann mit substr auslesen.

Pseudocode:


start=s.indexof(<anfang>);
if(start>-1){
start+=<anfang>.length;
stop=s.indexof(<ende>,start);
if(stop>-1) result=s.substr(start,stop-start);
}
Aber ein regulärer Ausdruck wäre hier angemessen.
(Einfach TESTDATEN durch (.+?) ersetzen)

Devil589
06.12.2010, 23:01
Danke für die Antwort.
Hm wenn du sagst das RegEx besser wäre in dem Fall könntest du mir da sagen wie ich das richtig mache?
Denn ich habe folgendes versucht was aber nicht klappt (Dein RegEx mit einbezogen):

Regex match = new Regex("(?<=li style=\"margin-bottom: 1em;margin-left:0px\">) (.+?) (?=</li>)");

Text = match.Match(HTML).ToString();

richTextBox1.Text = Text;

In der Variable HTML befindet sich mein Quellcode den ich durchsuchen will.

Denn ich habe gedacht dass er damit nach dem li Tag sucht und mir dann den Inhalt gibt, was aber nicht klappt.

Vielen Dank schon mal.
See Ya!

inout
06.12.2010, 23:10
Du musst auch die Gruppe auslesen:


Regex r = new Regex("<li style=\"margin-bottom: 1em;margin-left:0px\">(.+?)</li>");
Match m = r.Match(HTML);
if(m.Success) richTextBox1.Text = m.Groups[1].Value;

Devil589
06.12.2010, 23:21
Ah ok danke.
Ich habe es jetzt so versucht wie du sagtest nur dann bekomme ich ein leeres Resultat zurück.
Ich bin auch mit dem Debugger durch gegangen und habe gesehen das die <li> Tags alle entfernd wurden.
Und das m.Success gibt somit false zurück.
Im grunde versuche ich ja einfach nur alle Inhalte der <li> Tags auszulesen die ich in dem Quellcode der jeweiligen Internetseite finde.

Vielleicht habe ich ja irgentwo anders noch ein Fehler darum poste ich mal das was ich bis jetzt habe.



string url = "http://www.URL.de";
string HTML = "";
string Text = "";
WebRequest req = WebRequest.Create(url);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);

string s = sr.ReadToEnd();
HTML = s;

Regex r = new Regex("<li style=\"margin-bottom: 1em;margin-left:0px\">(.+?)</li>");
Match m = r.Match(HTML);
if(m.Success) richTextBox1.Text = m.Groups[1].Value;


Ich weiß absolut nicht wo der Fehler noch sein kann.
Über weitere Hilfe wäre ich sehr dankbar.

See Ya!

inout
06.12.2010, 23:38
Der Code ist korrekt. Es scheint so, als wenn der reguläre Audruck nicht auf den Quelltext der Seite passt. Am besten nennst du uns mal die Seite und/oder den Quelltext der Seite (bzw. einen Auszug) und die Stelle(n), die du genau auslesen möchtest.

Btw. wenn du allgemein alle li-Tags matchen möchtest, kannst du auch mal folgendes probieren:


Regex r = new Regex("<li.*?>(.+?)</li>");
foreach(Match m in r.Matches(HTML))
MessageBox.Show(m.Groups[1].Value);

Devil589
07.12.2010, 12:24
Hallo, danke für deine Antwort.
Ich habe es so versucht aber ich bekomme dann keine Messageboxes komischerweise.
Also es geht um folgende Seite bzw. Url:

string url = "http://www.meinestadt.de/berlin/telefonbuch/suche?vorname=martin&name=&strasse=&formtype=detailsuche";

Wobei ich jetzt "Berlin" und "Martin" nur als Test eingetragen habe.
Ich bekomme dann den kompletten Quellcode der Seite und auch Suchergebnisse sind mit dabei.
Die Suchergebnisse sind dann in <li> Tags wie z.B. der Name, Straße usw.

Ich hoffe du oder jemand anders kann mir da weiter helfen.
Vielen Dank schon mal.

See Ya!

inout
07.12.2010, 12:50
Also mit <li> sehe ich da nichts... ;)

Name, Straße usw. kannst du aber so auslesen:


Regex r = new Regex("<a class=\"katalogtitel\".+?>(.+?)</a>\\s*</div><div class=\"mt-ms_address\">\\s*(.+?)\\s*<br/>\\s*(.+?)\\s*</div>");
foreach (Match m in r.Matches(HTML))
MessageBox.Show(m.Groups[1].Value + '\n' + m.Groups[2].Value + '\n' + m.Groups[3].Value);

(getestet und funktioniert)

Devil589
07.12.2010, 13:21
Ah cool danke.
Aber doch weiter unten sind die <li> Tags, denn dein RegEx gibt im Moment nur die oberen Sachen aus was aber Branchen sind.
Weiter unten im Quellcode ca. bei 3/4 sind die <li> Tags die, die normalen Leute beinhält und die brauche ich halt.

Wäre super wenn du mir dabei noch helfen würdest.
Vielen Dank schon mal.

inout
07.12.2010, 13:37
Ach, hast Recht, das habe ich so schnell gar nicht gesehen ;)

Das müsste jetzt so aussehen, wobei dieser Pattern nur matcht, wenn alle Angaben vorhanden sind; wenn du das nicht möchtest, kannst du die entsprechenden Gruppen mit einem ? optionalisieren.


Regex r = new Regex("<li.*?>\\s*<a.*?>\\s*(.+?),\\s*<b>(.+?)</b>\\s*</a><br>\\s*(.+?),\\s*(.+?),\\s*<b>Tel\\.:\\s*(.+?)</b>\\s*<br>\\s*</li>");
foreach (Match m in r.Matches(HTML))
MessageBox.Show(m.Groups[1].Value + '\n' + m.Groups[2].Value + '\n' + m.Groups[3].Value + '\n' + m.Groups[4].Value + '\n' + m.Groups[5].Value);

Devil589
07.12.2010, 13:41
Woah vielen lieben Dank.
Das funktioniert wunderbar. :)
Aber sag mal, hast du irgentwie Tips wie man sich besser mit RegEx anfreunden kann?
Denn ich seh da noch nicht wirklich durch.
Ach und wie kann ich mir jetzt z.B. die ganzen Daten in einer Richtextbox ausgeben lassen denn wenn ich anstatt die MessageBox eine Richtextbox nehme bekomme ich nur das letzte Ergebnis.

P.s.: Denn du scheinst recht fit in RegEx zu sein. (Was ich auch gerne sein möchte :P)

Vielen Dank noch mal. :)

inout
07.12.2010, 13:55
Aber sag mal, hast du irgentwie Tips wie man sich besser mit RegEx anfreunden kann?
Tutorials findet man genug. Hier z.B. ein ganz guter Einstieg: Regular Expression Tutorial - Learn How to Use Regular Expressions (http://www.regular-expressions.info/tutorial.html) (Englisch)
Am meisten bringt aber immer noch die praktische Anwendung. Du kannst dich ja mal mit Perl beschäftigen, dann kommt das von selbst.

Ach und wie kann ich mir jetzt z.B. die ganzen Daten in einer Richtextbox ausgeben lassen denn wenn ich anstatt die MessageBox eine Richtextbox nehme bekomme ich nur das letzte Ergebnis.


foreach (Match m in r.Matches(HTML))
richTextBox1.AppendText(m.Groups[1].Value + ',' + m.Groups[2].Value + ',' + m.Groups[3].Value + ',' + m.Groups[4].Value + ',' + m.Groups[5].Value + '\n');


P.s.: Denn du scheinst recht fit in RegEx zu sein. (Was ich auch gerne sein möchte :P)
Joa, so die nötigsten Grundlagen ;)

Devil589
07.12.2010, 13:59
Hab vergessene ein Edit zu machen denn das mit dem AppendText hab ich eben auch gefunden. :)
Aber trotzdem vielen lieben Dank noch mal und danke für den Tipp.

The_Funeral
09.12.2010, 14:47
Mir hat diese Seite früher mal gut geholfen: Regex Tester &ndash; RegexPal (http://regexpal.com/)
Da kannst du direkt sehen, was deine Expression findet.