htmlagilitypack xpath ne fonctionne pas

c# html-agility-pack xpath

Question

J'ai un problème que mon xpath ne fonctionne pas.

J'essaie d'obtenir l'URL du prochain lien de Google.com en bas.

Mais je ne parviens pas à accéder à l’URL avec Xpath.

Aidez-moi s'il vous plaît à corriger mon xpath. Dites-moi aussi ce qui devrait être à la place de ??

HtmlWeb hw = new HtmlWeb();

HtmlAgilityPack.HtmlDocument doc = hw.Load("http://www.google.com/search?q=seo");
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//*[@id='pnnext']");

foreach (HtmlNode linkNode in linkNodes)
{
    HtmlAttribute link = linkNode.Attributes["href"];
    MessageBox.Show(link.Value );
}

Réponse acceptée

La chose étrange ici est que de toute façon, HtmlAgilityPack ne reconnaît pas l'attribut id du lien "Suivant".

Cela pourrait être un bug dans HtmlAgilityPack; vous pouvez l'afficher dans HAP Issue Tracker .

Cependant, dans l'intervalle, j'ai trouvé cette solution de contournement:

  • trouver la table qui contient les éléments de pagination (la table avec id="nav" ). Pour cet élément l'identifiant est correctement reconnu
  • prend le premier (et seul tr ) de la table et son dernier td (en utilisant la fonction XPath last() )
  • prendre a élément à l' intérieur du td , nous avons obtenu à l'étape précédente.

Longue histoire courte, voici le code:

var doc = new HtmlWeb().Load("http://www.google.com/search?q=seo");

var nextLink = doc.DocumentNode
    .SelectSingleNode("//table[@id='nav']/tr/td[last()]/a");

Console.WriteLine(nextLink.GetAttribute("href", "err"));

Mettre à jour

Après le commentaire de Simon, j'ai vérifié à nouveau et la conclusion est qu'il ne s'agit pas d'un bogue dans HTML Agility Pack; l'attribut id="pnnext" n'est présent que lorsque la demande est faite par un navigateur (peut-être en fonction de la valeur de l'en-tête UserAgent ). Lorsque vous faites un HttpWebRequest partir de code, HttpWebRequest comment le lien "Suivant" apparaît dans la sortie:

<a href="/search?q=seo&amp;hl=en&amp;ie=UTF-8&amp[...]" style="text-align:left">



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