htmlagilitypack xpath non funziona

c# html-agility-pack xpath

Domanda

Ho un problema che il mio xpath non funziona.

Sto cercando di ottenere l'URL del prossimo link di Google.com in basso.

Ma non riesco a raggiungere l'url usando Xpath.

Per favore aiutami a correggere il mio xpath. Dimmi anche cosa dovrebbe essere sul posto di ??

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 );
}

Risposta accettata

La cosa strana qui è che in qualche modo HtmlAgilityPack non riconosce l'attributo id del collegamento "Avanti".

Questo potrebbe essere un bug in HtmlAgilityPack; puoi postarlo nel HAP Issue Tracker .

Tuttavia, nel frattempo ho trovato questa soluzione:

  • trova la tabella che contiene gli elementi di paging (la tabella con id="nav" ). Per questo elemento l'ID è riconosciuto correttamente
  • prendi il primo (e solo tr ) nella tabella e l'ultimo td (usando la funzione XPath last() )
  • prendi a elemento all'interno del td abbiamo ottenuto nel passaggio precedente.

Per farla breve, ecco il codice:

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

Aggiornare

Dopo il commento di Simon, l'ho controllato di nuovo e la conclusione è che questo non è un bug in HTML Agility Pack; l'attributo id="pnnext" è presente solo quando la richiesta viene effettuata da un browser (forse in base al valore dell'intestazione UserAgent ). Facendo un HttpWebRequest dal codice, questo è il modo in cui il link "Successivo" appare nell'output:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché