2012-12-15 17 views
5

Chcę uzyskać 2 linki od wewnątrz div.HtmlAgilityPack Uzyskaj wszystkie linki wewnątrz DIV

Obecnie mogę wybrać jedną, ale jeśli nie ma więcej, wydaje się, że nie działa.

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."; 

Próbując dostać od tego kawałka HTML:

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

Każda pomoc jest mile widziana, Dzięki z góry.

+0

Deejdd, Być może zainteresuje Cię bardziej uniwersalne rozwiązanie, które może być z powodzeniem stosowane w wielu innych przypadkach. –

Odpowiedz

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

Przetestowałem to, ale dla jakiegoś reasen chwyta wszystkie łącza poza wybranym div, – Deejdd

+0

@Deejdd I zaktualizowałem odpowiedź –

+3

Dzięki tona to działało, nie może cię przyjąć ze względu na brak wystarczającej rep. – Deejdd

3

Użyj tego XPath:

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

To chwyta wszystkie potomka a elementy div z class = 'myclass'.

I //[email protected] jest niepoprawny XPath.

+0

Praca również, dzięki. – Deejdd

+0

Niewielkie pytanie, czy można to zrobić: // div [@class = 'pół na'] Jeśli nie znasz dokładnej nazwy klasy, aby nadal ją wyszukiwać. – Deejdd

+0

@Deejdd, czy możesz wyjaśnić? Z twojego przykładu wiesz, że '@class = 'half na''. –

2

Zastosowanie:

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

Wybiera a dowolny element, który jest potomkiem dowolnego div którego class atrybut zawiera nazwę klasy z "myclass".

Nazwa klasy może być pojedyncza lub atrybut może również zawierać inne nazwy klas. W tym przypadku nazwa klasy może być początkowa lub ostatnia lub może być otoczona innymi nazwami klas - powyższe wyrażenie XPath prawidłowo wybiera żądane węzły we wszystkich tych różnych przypadkach.

+0

Dziękuję za publikację, uwielbiam widzieć różne dodatki, aby osiągnąć ten sam wynik. – Deejdd

+0

@Deejdd, Nie ma za co. Czy zauważyłeś, że to rozwiązanie jest mocniejsze i bardziej odpowiednie niż pozostałe odpowiedzi? Wybiera pożądane węzły, nawet jeśli atrybut 'class' niektórych nurkowań ma postać" 'class =" class1 myclass class2 "' - podczas gdy wszystkie inne odpowiedzi nie potrafią prawidłowo wybrać żądanych węzłów w takim przypadku. –