C# Wie kann ich bestimmte Tags aus einem HTML Code auslesesn?

...komplette Frage anzeigen

3 Antworten

Auch hier hilft das HtmlAgilityPack. Einfach mal danach suchen.

Antwort bewerten Vielen Dank für Deine Bewertung
CrystalixXx 05.03.2016, 09:20

Ich habe mal eben ein Beispiel geschrieben:

Dim webHtml As New HtmlAgilityPack.HtmlWeb
Dim webDocument As HtmlAgilityPack.HtmlDocument
Dim spanElements As HtmlAgilityPack.HtmlNodeCollection

webDocument = webHtml.Load("https://www.gutefrage.net/")
spanElements = webDocument.DocumentNode.SelectNodes("//span[@class='Button-text']")

If spanElements IsNot Nothing Then
For Each span In spanElements
Debug.WriteLine(span.InnerText)
Next
End If

Du kannst deine Span-Elemente mittels XPath ermitteln. Die dafür benötigte Methode ist "SelectNodes" oder - wenn du nur ein einziges Element haben willst - "SelectSingleNodes".

1
DasesColles 05.03.2016, 09:32
@CrystalixXx

Danke für den Hinweis und den Code. Bei meinem Code bräuchte ich dann span[@class=message]

Sehe ich das richtig?

0
DasesColles 05.03.2016, 11:44
@CrystalixXx

Kann ich den Html-Code auch aus einem webbrowser auslesen mit dem HtmlAgilityPack? Das wäre nämlich wichtig.

0
CrystalixXx 05.03.2016, 11:48
@DasesColles

Ja.

Dim webDocument As New HtmlAgilityPack.HtmlDocument
Dim spanElements As HtmlAgilityPack.HtmlNodeCollection

webDocument.LoadHtml(WebBrowser1.DocumentText)
spanElements = webDocument.DocumentNode.SelectNodes("//span[@class='Button-text']")

If spanElements IsNot Nothing Then
For Each span In spanElements
Debug.WriteLine(span.InnerText)
Next
End If
0
DasesColles 05.03.2016, 11:54
@CrystalixXx

Du hast mir ja den code immern in vb.net geschrieben, hab ihn bis jetzt zwar immer umschreiben können, jedoch bei der foreach schleife gibt es bei mir kein span sondern nur timespan und das ist ja nicht das was ich brauche. Was muss ich da bei C# hinschreiben?

0
CrystalixXx 05.03.2016, 11:58
@DasesColles

Stimmt, sorry. So sollte es funktionieren.

HtmlAgilityPack.HtmlDocument webDocument = new HtmlAgilityPack.HtmlDocument();
HtmlAgilityPack.HtmlNodeCollection spanElements;

webDocument.LoadHtml(WebBrowser1.DocumentText);
spanElements = webDocument.DocumentNode.SelectNodes("//span[@class='Button-text']");

if (spanElements != null)
{
foreach (HtmlAgilityPack.HtmlNode span in spanElements)
{
Debug.WriteLine(span.InnerText);
}
}
1
DasesColles 05.03.2016, 12:10
@CrystalixXx

Könntest du mir vielleicht noch erklären warum das 

"//span[@class='message']

heißen muss und nicht so wie in dem Html code

<SPAN class="message">

denn ich bekomme keine ausgabe, obwohl im HtmlCode das drin steht

0
CrystalixXx 05.03.2016, 12:19
@DasesColles

Das ist XPath. XPath ist eine Abfragesprache und besitzt daher eine eigene Syntax. Kurz eläutert:

  • //span - wählt alle <span>-Elemente aus dem Dokument aus
  • [@class] - schränkt die Auswahl auf jene <span>-Elemente ein, die ein class-Attribut besitzen
  • ='message' - schränkt die Auswahl auf jene <span>-Elemente ein, die ein class-Attribut mit dem Wert message besitzen

Das wären dann genau deine von dir beschriebenen Elemente. Es gibt noch deutlich mehr Möglichkeiten um Einschränken zu treffen. Du kannst dich mal hier bei den Beispielen umsehen: https://msdn.microsoft.com/de-de/library/ms256086.aspx

0
DasesColles 05.03.2016, 12:27
@CrystalixXx

Danke, aber warum macht der nach einer bestimmten Anzahl an Zeichen einen Zeilen Umbruch?

HtmlCode

<SPAN class="message">sehrsehrlangertext undnochvielmehrtexthier</SPAN>

aber als Ausgabe bekomm ich aber zwei Zeilen und zwar

sehrsehrlangertext                                undnochvielmehrtexthier

kann man das noch ändern?

0

HtmlAgilityPack ist vorzuziehen, aber bei so einer kleinen Aufgabe evtl. ein Overkill.

Nimm einfach alternativ einen Regulären Ausdruck:

Regex re = new Regex("<span class=\\\\"message\\\\">(.+?)</span>", RegexOptions.IgnoreCase);

string text = re.Match(html).Groups[1].Value

Der Quelltext der HTML-Seite muss dabei in der Variable "html" vorliegen. :)
Antwort bewerten Vielen Dank für Deine Bewertung
TeeTier 04.03.2016, 21:14

Ach du meine Güte ... der WYSIWYG-Editor hier auf GF ist ja noch viel verbuggter, als ich befürchtet habe.

Was für ein Pfusch ... ><

0
DasesColles 04.03.2016, 22:04
@TeeTier

Danke für die Antwort. Hat mir echt weiter geholfen. Danke vielmals.

0
DasesColles 04.03.2016, 22:11
@TeeTier

Noch eine weitere Frage:
span class=message text /span kann öfter in dem Html Code vorkommen, jedoch nicht unbedingt mit "text" sondern auch z.B. "bla". Wie kann ich die verschiedenen "messages" in ein String[] schreiben?

0
CrystalixXx 04.03.2016, 22:30
@DasesColles

Verwendet statt "re.Match" die Methode "re.Matches". Die gibt dir eine Collection aller gefundenen Übereinstimmungen zurück.

Wenn du willst, dann kannst du durch die Collection mit einer For Each Schleife iterieren und sie z.B. einer "List(Of String)" hinzufügen.

1
DasesColles 04.03.2016, 22:35
@CrystalixXx

aber ich muss schon .Groups[1].Value weglassen oder? Sonst gibts einen Fehler

0
DasesColles 04.03.2016, 22:59
@CrystalixXx

Kannst du mir da vllt ein Code-Beispiel schicken? Check grad nicht wie ich des mit re.Matches machen soll.

0
DasesColles 05.03.2016, 01:19
@CrystalixXx

Ok, ein Problem hab ich noch. Der Text in den Tags "Text" darf anscheinend nicht länger als 15 Zeichen sein. Kann man das irgendwie ändern?

0
CrystalixXx 05.03.2016, 09:00
@DasesColles

Es werden beliebig lange Zeichenketten ausgewertet, da gibt es keine konkrete Begrenzung. Problematisch wird es aber, wenn das zugrundeliegende HTML-Format nicht wohlgeformt ist und Inline-Elemente verschachtelt werden, z.B. wenn ein span-Element innerhalb eines anderen span-Elementes vorliegt.

0
CrystalixXx 05.03.2016, 08:54

@TeeTier

Wenn du seinen letzten Kommentar anschaust, dann verstehst du vielleicht, wieso ich selten zu Regex rate, wenn es Alternativen gibt. :) Das Problem bei Regex ist häufig, dass nicht alle Bedingungen klar formuliert sind, weshalb das Pattern nicht gleich den Vorstellungen des Fragenden entspricht. Dann wuselt man immer ewig rum - ist eben schwierig. Aber immerhin ist Regex schnell in der Ausführung und Programmierung und auch kurz, man muss es nur verstehen.

0

Hier nochmal der tag ohne spitze Klammern

SPAN class="message" test /SPAN

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?