2016-04-02 15 views
0

Ich habe verschiedene verschiedene Methoden (Webclient, Webrequest, etc) versucht, dies zu tun, aber ich konnte es schließlich nicht tun.C# Zugriff auf HTML-Element ohne ID

<td class="period_slot_1"> 
<strong>TG</strong> 

Was ich will, ist Zugriff auf den Text-Wert von über zu bekommen, so dass ich „TG“ als Ergebnis erhalten wird.

Wie kann ich das tun?

+0

Sie können einen regulären Ausdruck verwenden. Oder ein HTML-Parser. –

Antwort

0

Ich bin ein Fan von AngleSharp. Hier ist ein minimales Beispiel mit Ihrem HTML-Snippet.

 static void Main(string[] args) 
     { 
      var source = @" 
<html> 
<head> 
</head> 
<body> 
    <td class=""period_slot_1""> 
    <strong>TG</strong> 
</body> 
</html>"; 

      var parser = new HtmlParser(); 
      var document = parser.Parse(source); 
      var strong = document.QuerySelector("strong"); 

      Console.WriteLine(strong.TextContent); 
     } 

Die QuerySelector() Methode nimmt einen CSS-Selektor, so dass Sie natürlich "strong" problemlos auswählen können.

Wenn Sie Daten aus einer Tabelle abfragen möchten und die Klasse zählt, können Sie (wiederum unter Verwendung von normalem DOM aus JavaScript, das Sie wahrscheinlich verwenden) das DOM und LINQ zum Projizieren der Klassen und Daten verwenden. wie

  static void Main(string[] args) 
      { 
       var source = @" 
<table> 
    <tr> 
     <td class=""period_slot_1""> 
      <strong>TG</strong> 
     </td> 
     <td class=""period_slot_2""> 
      <strong>TH</strong> 
     </td> 
     <td class=""period_slot_3""> 
      <strong>TJ</strong> 
     </td> 
    </tr> 
    <tr> 
     <td class=""period_slot_1""> 
      <strong>YG</strong> 
     </td> 
     <td class=""period_slot_2""> 
      <strong>YH</strong> 
     </td> 
     <td class=""period_slot_3""> 
      <strong>YJ</strong> 
     </td> 
    </tr> 
</table>"; 

       var parser = new HtmlParser(); 
       var document = parser.Parse(source); 
       var strongs = document.QuerySelectorAll("td > strong") 
        .Select(x => new 
        { 
         Class = x.ParentElement.ClassName, 
         Data = x.TextContent 
        }) 
        .OrderBy(x => x.Class); 

       strongs.ToList().ForEach(Console.WriteLine); 
      } 

Ausgänge:

{ Class = period_slot_1, Data = TG } 
{ Class = period_slot_1, Data = YG } 
{ Class = period_slot_2, Data = TH } 
{ Class = period_slot_2, Data = YH } 
{ Class = period_slot_3, Data = TJ } 
{ Class = period_slot_3, Data = YJ } 
+0

Es funktioniert! ich danke dir sehr. Aber seit ich versuche, diese Daten von der Website zu lesen, wie könnte die var-Quelle auf die Website verweisen, so dass es tatsächlich lädt von der Website? –

+0

Die Readme-Dokumentation zu Anglesharp enthält ein Beispiel zum Laden einer Site: https://github.com/AngleSharp/AngleSharp#simple-demo – jdphenix

+0

Vielen Dank :) –

0

Verwenden Sie getElementsByClassName, um Eltern zu identifizieren und dann nach Nachkommen zu suchen.

var parent = getElementsByClassName("period_slot_1") 
var descendants = parent.getElementsByTagName("strong"); 
if (descendants.length) 
{ 
    // logic goes here. 
} 
+0

Danke für den Kommentar! Obwohl ich nicht verstehe, warum du da (abcents.length) hinstellst? –

+0

Nur sicherstellen, dass wir Elemente in den ** Nachkommen haben ** –

+0

Sorry für weiterfragen. Also habe ich Element nach Tagname von "stark", in var Nachkommen, aber wie bekomme ich Zugriff auf die Informationen, die dort gespeichert ist (was wird die TG sein)? –