Entwickler-Ecke

Basistechnologien - Regex HTML Tags


Bordon - Mo 21.03.16 22:03
Titel: Regex HTML Tags
Hallo zusammen,
ich bin am verzweifeln. Ich möchte folgenden HTML-Code:


HTML-Dokument
1:
2:
3:
4:
5:
<td class="balkenL"><div style="width:16px;background-color:#D30029;"> </div></td>
<td class="wertL"><span>107,35</span></td>
<td class="wertCaption">Fehlpässe</td>
<td class="wertR">104,82</td>
<td class="balkenR"><div style="width:16px;background-color:#C2BFBF;"> </div></td>




mit regex so entfernen, dass nur das Wort "Fehlpässe" herausgefiltert wird.

Kann mir hierzu bitte jemand helfen?

Danke vorab.

Grüße

Moderiert von user profile iconChristian S.: HTML-Tags hinzugefügt


Christian S. - Mo 21.03.16 22:44

Wenn der Tag, der da drum herum ist, eindeutig ist, sollte es so gehen:

C#-Quelltext
1:
2:
3:
4:
var rx = new Regex(@"<td class=""wertCaption"">(.*?)</td>");
var m = rx.Match(textBox1.Text);
if (m.Success)
  MessageBox.Show(m.Groups[1].ToString());


Palladin007 - Di 22.03.16 00:04

Ich würde es eher in diese Richtung machen:


Quelltext
1:
<td.*?class="wertCaption".*?>(?<value>[^<]*)                    


Hier [https://regex101.com/r/yJ9pQ8/1] das ganze nochmal schön formatiert.

So kann der HTML-Code variieren, solange es ein td-Tag mit der Klasse "wertCaption" ist und im Wert selber kleine öffnende spitze Klammer steht.
Lässt sich sicher noch verfeinern, besonders im Hinblick auf das Parsen vom HTML-Code selber, aber ich denke, dass das ausreicht.


Christian S. - Di 22.03.16 00:41

Könntest Du den regulären Ausdruck bitte (zusätzlich) hier ins Forum schreiben, damit wir alles hier beisammen haben und nicht drauf angewiesen sind, dass der Link auch in Zukunft noch geht? Danke! :)


Palladin007 - Di 22.03.16 00:48

Hab's oben editiert :)


Ralf Jansen - Di 22.03.16 14:28

Sollte man nicht eher wen es um html geht ein echtes DOM aufbauen um irgendwas gezielt auszulesen?
Z.b via Html Agility Pack [https://htmlagilitypack.codeplex.com/]


Bordon - Di 22.03.16 18:25

Hallo zusammen,
zuerst mal danke für die schnellen Antworten. Der Beitrag von Christian S. hat zunächst funktioniert.
Jedoch möchte ich nun alle Werte (sind ca. 12 Stück) aus dem HTML-Code filtern. Bisher bekomme ich nur ein Ergebnis.

Ich denke mal dass ich das mit einer Foreach-Schleife lösen kann, oder?

Grüße


Christian S. - Di 22.03.16 18:48

Du wirst dann statt der Match die Matches-Methode anwenden müssen, ansonsten sollte das das gleiche sein. Ich würde Dir aber wirklich den Regex empfehlen, den user profile iconPalladin007 vorgeschlagen hat. :-)

//edit: @Ralf: Ich glaube, manchmal ist es einfacher einen Regex zu nehmen, aber generell ist Dein Ansatz der sauberere.


Bordon - Di 22.03.16 19:28

Hab das Pattern von Palladin007 genommen und es funktioniert genauso - danke schonmal.
Allerdings gibt es bei Matches die Success-Methode nicht. Gibt es da was vergleichbares?






C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
WebClient web = new WebClient();
string htmlCode = web.DownloadString(url);

string pattern = @"<td.*?class=""wertCaption"".*?>(?<value>[^<]*)";
Regex rx1 = new Regex(pattern);
var m = rx1.Matches(htmlCode);

if (m.Success)
{
    Console.WriteLine(m.Groups[1].ToString());
}
Console.ReadLine();


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Christian S. - Di 22.03.16 19:38

Matches gibt eine MatchCollection zurück, also eine Liste von Einzel-Matches. Über diese Einträge iterierst Du. Wenn nichts gefunden wurde, ist die Collection leer (aber nicht null).


Ralf Jansen - Di 22.03.16 20:14

Zitat:
@Ralf: Ich glaube, manchmal ist es einfacher einen Regex zu nehmen, aber generell ist Dein Ansatz der sauberere.


Korrekt. Hier? ... hmh. Für wie wahrscheinlich halten wir es das er aus dem Html tatsächlich nur den Inhalt von WertCaption braucht :suspect:


Bordon - Di 22.03.16 23:32

Naja, bin in der Hinsicht nicht der crack, möchte mich aber damit beschäftigen damit ich dazulernen kann.
Habe es nun mal versucht, bekomme mit folgendem coding auch die Ergebnisse, allerdings werden bei der Ausgabe (siehe Anhang) die html-Tags
<td class="wertCaption">
ebenfalls mit ausgegeben. Möchte eigentlich nur die Werte.



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
WebClient web = new WebClient();
string htmlCode = web.DownloadString(url);
string pattern = @"<td.*?class=""wertCaption"".*?>(?<value>[^<]*)";

Regex rx1 = new Regex(pattern);
MatchCollection matches = rx1.Matches(htmlCode);
foreach (Match match in matches)
{
foreach (Capture capture in match.Captures)
{
Console.WriteLine(capture.Value);
}
}
Console.ReadLine();



So wie es aussieht muss ich mich doch mit HtmlAgilityPack befassen. Außer ihr habt noch eine Idee dazu!?

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Christian S. - Di 22.03.16 23:43

Wieso benutzt Du Captures? Und hast Du Dir in der Doku [https://msdn.microsoft.com/de-de/library/system.text.regularexpressions.group.captures(v=vs.110).aspx] mal angeguckt, wie man es benutzt?