XPath Expression ne fonctionne pas dans HtmlAgilityPack

c# html-agility-pack xpath

Question

Je sais que cela vient peut-être de ma noblesse dans XPath, mais laissez-moi vous demander de vous assurer que, parce que j'ai suffisamment repéré sur Google.

J'ai un site web et je veux en avoir les nouvelles: www.farsnews.com (en persan)

En utilisant les extensions FireBug et FireXpath sous Firefox et à la main, j'extrais et testais plusieurs expressions Xpath correspondant aux en-têtes, telles que:

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

J'ai aussi testé ces derniers en utilisant l'extension XPather et ils semblent fonctionner plutôt bien, mais lorsque je parviens à les tester ... SelectNodes renvoie null!

Un indice ou un indice?

voici une partie du 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.

Réponse populaire

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()

Renvoie la «séquence vide», voir l'évaluation: http://xmltools.dk/EQA-ACA6

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

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

Cependant, s'il est possible que d'autres classes soient utilisées, utilisez ceci ( http://xmltools.dk/EwA8AJAW ):

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

(Je vois que c'est un problème d'encodage dans les liens que j'ai fournis, cependant, peu importe la signification et toutes les expressions XPath, vous pouvez enlever /text() pour obtenir les nœuds au lieu du texte uniquement)

MAIS, si vous êtes propriétaire de ce site, vous devez fournir les titres avec un code XML (peut-être RSS ou ATOM) ou JSON, qui offriront de meilleures performances et, plus important encore, une meilleure protection contre les balles.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi