2010-08-28 6 views
3

Je sais qu'il peut être de mon noobness dans XPath, mais permettez-moi de demander à vous assurer, parce que j'ai assez googlé.XPath Expression ne fonctionne pas dans HtmlAgilityPack

J'ai un site Web et que vous voulez obtenir les titres de nouvelles de lui: www.farsnews.com (il est persan)

Utiliser les extensions KPL et FireXpath sous Firefox et à la main-je extraire et tester de multiples expressions XPath qui correspond les rubriques, telles que:

* html/body/div[2]/div[2]/div[2]/div[*]/div[2]/a/div[2] 
* .//*[@class="topnewsinfotitle "] 
* .//div[@class="topnewsinfotitle "] 

J'ai également testé ces XPather en utilisant l'extension et ils semblent fonctionner assez bien, mais quand je reçois de les tester ... le SelectNodes retourne null!

Des indices ou indices?

est ici un morceau de code:

listBox2.ResetText(); 

HtmlAgilityPack.HtmlWeb w = new HtmlAgilityPack.HtmlWeb(); 
HtmlAgilityPack.HtmlDocument doc = w.Load("http://www.farsnews.com"); 
HtmlAgilityPack.HtmlNodeCollection nc = doc.DocumentNode.SelectNodes(".//div[@class=\"topnewsinfotitle \"]"); 

listBox2.Items.Add(nc.Count+" Items selected!"); 

foreach (HtmlAgilityPack.HtmlNode node in nc) { 
      listBox2.Items.Add(node.InnerText); 
     } 

Merci.

+0

Le nom de classe HTML doit-il contenir un espace à la fin? SelectNodes renvoie null pour chaque cas, même le plus trivial? – Dialecticus

Répondre

4

J'ai testé vos expressions. Et comme mentionné par Dialecticus dans un commentaire, vous avez un espace de fin qui ne devrait pas être là.

//div[@class='topnewsinfotitle ']/text() 

de séquence vide 'retour, voir l'évaluation: http://xmltools.dk/EQA-ACA6

//div[@class='topnewsinfotitle']/text() 

Renvoie une liste de vos titres, consultez: http://xmltools.dk/EgA2APAj

Cependant, s'il pourrait y avoir d'autres classes que vous utilisez ce (http://xmltools.dk/EwA8AJAW):

//div[contains(@class, 'topnewsinfotitle')]/text() 

(je vois qu'ils sont un en problème de codage dans les liens que j'ai fournis, cependant, il ne devrait pas importer pour le sens et pour toutes les expressions XPath, vous pouvez supprimer /text() pour obtenir les nœuds au lieu de seulement le texte)

MAIS, si vous possédez ce site, vous devriez fournir les titres avec un XML (peut-être RSS ou ATOM) ou JSON qui aura de meilleures performances et, surtout, être plus à l'épreuve des balles.

Questions connexes