¿Cómo puedo eliminar datos de una página web después de buscar los datos deseados con HTML Agility?

Quiero obtener información de este sitio web

en mi página ASPX usando HTML Agility Pack. Pero no puedo hacer eso, ya que los datos se cargan después de buscar los datos en la página web.

Necesito que se hagan algunos datos continuamente después de un intervalo de 5 minutos.

Los resultados de las búsquedas en el sitio web que ha mencionado se procesan dinámicamente utilizando Javascript y los datos se obtienen como respuesta de Json a través de Ajax. HtmlAgilityPack está destinado a analizar Html, no Json.

Considere usar los controladores Selenium o iMacros para .Net o la clase WebBrowser proporcionada por Microsoft Framework. Estas herramientas ejecutan un navegador en segundo plano, por lo que pueden ejecutar código JavaScript en esa página y procesar Html que desea raspar.

Solo necesita configurar el tiempo de espera adecuado, por lo que seguirán esperando hasta que los resultados de búsqueda aparezcan en la página.

Como @derloopkat ya dijo. Solo usa Selenio.

El sitio usa javascript y ajax para actualizar el HTML de la página. Incluso si realizó una solicitud HTTP como con la siguiente url:

 https://enquiry.indianrail.gov.in/ntes/NTES?action=getTrainsViaStn&viaStn=NDLS&toStn=null&withinHrs=2&trainType=ALL&6iop0ssrpi=1m1ol4ha86 

Solo recibirá lo siguiente:

 (function(){location.reload();/*ho ho ho ho*/})() 

Lo que significa que el último parámetro de la url:

 &6iop0ssrpi=1m1ol4ha86 

Es algún tipo de “contraseña” (por falta de una mejor palabra). Eso asegura que no puedas simplemente reproducir las solicitudes. Ahora podrías tratar de descifrar esto. Pero está oscurecido en un archivo javascript que contiene 3396 líneas de código muy denso. Por lo tanto, es muy difícil (quizás incluso imposible) averiguar qué enviar al servidor para recibir los datos que desea.

Aún mejor es que la respuesta del servidor nunca será HTML, sino JSON. Formateado así:

  _obj_1511003507337 = { trainsInStnDataFound:"trainRunningDataFound", allTrains:[ { trainNo:"14316", startDate:"18 Nov 2017", trainName:"INTERCITY EXP", trnName:function(){return _LANG==="en-us"?"INTERCITY EXP":"इंटरसिटीएक्स."}, trainSrc:"NDLS", trainDstn:"BE", runsOn:"NA", schArr:"Source", schDep:"16:35, 18 Nov", schHalt:"Source", actArr:"Source", delayArr:"RIGHT TIME", actDep:"16:35, 18 Nov", delayDep:"RIGHT TIME", actHalt:"Source", trainType:"MEX", pfNo:"9" } , trainNo:"12625", startDate:"16 Nov 2017", trainName:"KERALA EXPRESS", trnName:function() { return _LANG === "en-us" ? "KERALA EXPRESS" : "केरलएक्स."}, trainSrc:"TVC", trainDstn:"NDLS", runsOn:"NA", schArr:"13:45, 18 Nov", schDep:"Destination", schHalt:"Destination", actArr:"16:56, 18 Nov", delayArr:"03:11", actDep:"Destination", delayDep:"RIGHT TIME", actHalt:"Destination", trainType:"SUF", pfNo:"4" } ] } 

Aquí está la solución para obtener el HTML y los datos usando Selenium.

 using System; using System.Collections.Generic; using System.Net; using HtmlAgilityPack; using OpenQA.Selenium.Firefox; using OpenQA.Selenium; using System.Threading; namespace test { class Program { public static void Main(string[] args) { string url = "https://www.google.com"; IWebDriver driver = new FirefoxDriver(); driver.Navigate().GoToUrl("https://enquiry.indianrail.gov.in"); Console.WriteLine("Step 1"); driver.FindElement(By.XPath("//a[@id='ui-id-2']")).Click(); Thread.Sleep(10000); Console.WriteLine("Step 2"); driver.FindElement(By.XPath("//input[@id='viaStation']")).SendKeys("NEW DELHI [NDLS]"); Thread.Sleep(2000); Console.WriteLine("Step 3"); driver.FindElement(By.XPath("//button[@id='viaStnGoBtn']")).Click(); //PRESS A KEY WHEN THE HTML IS FULLY LOADED Console.ReadKey(); HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(driver.PageSource); HtmlNodeCollection nodeCol = doc.DocumentNode.SelectNodes("//body//tr[@class='altBG']"); foreach(HtmlNode node in nodeCol){ Console.WriteLine("Trip:"); foreach(HtmlNode child in node.ChildNodes) { Console.WriteLine("\t" + child.InnerText); } } //Console.WriteLine(doc.DocumentNode.InnerHtml); Console.ReadKey(); } 

El Thread.Sleep () no debería ser necesario. Simplemente los puse como precaución. También se puede optimizar la velocidad si usa un controlador diferente, como PhantomJS, que es un controlador sin cabeza.