2012-12-15 11 views
5

Ich möchte in der Lage sein, 2 Links aus einem div zu bekommen.HtmlAgilityPack Holen Sie sich alle Links in einem DIV

Momentan kann ich einen wählen, aber wenn es mehr gibt, scheint es nicht zu funktionieren.

HtmlWeb web = new HtmlWeb(); 
     HtmlDocument doc = web.Load(url); 

HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='myclass']"); 

      if (node != null) 
      { 
       foreach (HtmlNode type in node.SelectNodes("//[email protected]")) 
       { 
        recipe.type += type.InnerText; 
       } 
      } 
      else 
       recipe.type = "Error fetching type."; 

Der Versuch, es aus diesem Stück HTML zu erhalten:

<div class="myclass"> 
<h3>Not Relevant Header</h3> 
    <a href="#">This text</a>, 
    <a href="#">and this text</a> 
</div> 

Jede Hilfe ist willkommen, Vielen Dank im Voraus.

+0

Deejdd, Es könnte Sie interessieren, eine viel allgemeinere Lösung zu sehen, die in vielen weiteren Fällen erfolgreich verwendet werden kann. –

Antwort

11
var div = doc.DocumentNode.SelectSingleNode("//div[@class='myclass']"); 
if(div!=null) 
{ 
    var links = div.Descendants("a") 
        .Select(a => a.InnerText) 
        .ToList(); 
} 
+0

Getestet, aber für einige reasen es alle Links außerhalb der ausgewählten div, – Deejdd

+0

@Deejdd Ich aktualisierte die Antwort –

+3

Vielen Dank, es hat funktioniert, kann nicht upvote Sie wegen nicht genug rep. – Deejdd

3

verwenden XPath:

//div[@class = 'myclass']//a 

Es greift alle Nachkommen a Elemente in div mit class = 'myclass'.

Und //[email protected] ist falsch XPath.

+0

Arbeiten auch, danke. – Deejdd

+0

Eine kleine Frage, ist es möglich, dies zu tun: // div [@class = 'halb na'] Wenn Sie nicht wissen, den genauen Klassennamen zu suchen immer noch. – Deejdd

+0

@Deejdd, Können Sie klären? Aus Ihrem Beispiel wissen Sie, dass '@ class = 'half na'. –

2

Verwenden:

//div[contains(concat(' ', @class, ' '), ' myclass ')]//a 

Dies wählt jede a Element, das ein Abkömmling von jedem div ist, dessen class Attribut enthält eine Klassenname von "myclass".

Der Klassenname kann einzeln sein, oder das Attribut kann auch andere Klassennamen enthalten. In diesem Fall kann der Klassenname der Anfangsname oder der letzte sein oder von anderen Klassennamen umgeben sein. Der obige XPath-Ausdruck wählt die gewünschten Knoten in allen diesen Fällen korrekt aus.

+0

Vielen Dank für das Posten, liebe es, die verschiedenen Take-ons zu sehen, um das gleiche Ergebnis zu erzielen. – Deejdd

+0

@Deejdd, Gern geschehen. Ist Ihnen aufgefallen, dass diese Lösung leistungsfähiger und anwendbarer ist als die übrigen Antworten? Es wird die gewünschten Knoten auswählen, auch wenn das 'class' Attribut einiger Tauchgänge die Form" class = "class1 myclass class2" 'hat - während alle anderen Antworten die gewünschten Knoten in einem solchen Fall nicht korrekt auswählen. –

Verwandte Themen