HTMLAgility Pack: Screen Scraping ¿No se puede encontrar una división con un guión en el nombre de la clase?

c# html-agility-pack screen-scraping

Pregunta

Esto es una especie de ejercicio de aprendizaje, pero también parte de "diversión". Básicamente, estoy tratando de analizar el precio del precio de una habitación del estado 'Balcón' (actualmente a $ 1039) en una aplicación de consola C #. La url es:

http://www.carnival.com/BookingEngine/Stateroom/Stateroom2/?embkCode=PCV&itinCode=SC0&durDays=8&shipCode=SH&subRegionCode=CS&sailDate=08082015&sailingID=68791&numGuests=2&showDbl=False&isOver55=N&isPastGuest=N&stateCode=&isMilitary=N&evsel=&be_version=1

Tengo la url arriba cargada bien en:

var document = getHtmlWeb.Load(web_address);

El contenedor para los precios de Balcony es un div con clase de ' col ' y es el 3er div dentro column-container clearfix clase column-container clearfix . Pensé que todo lo que necesitaría sería multar a todos los divs con clase por:

var document = getHtmlWeb.Load(web_address);

y luego seleccione el tercer nodo para llegar a los precios del balcón. Pero la variable lower_price sigue volviendo nula. Sé que el documento en sí está cargado y puedo ver dentro de ' col ' si selecciono ' col '. ¿Es el guión en la col-bottom que impide el descubrimiento de esa división?

¿Alguna forma alternativa de llegar a esto? Como dije, es sobre todo un ejercicio de aprendizaje. Pero tengo que crear algunas soluciones de monitoreo personalizadas que requieren un raspado de pantalla, por lo que no es solo diversión.

¡Gracias!

EDITAR fragmento de código HTML que contiene la información relevante:

var document = getHtmlWeb.Load(web_address);

Respuesta popular

No hay nada malo con los guiones en los nombres de atributos o valores que son html válidos, el problema con su fuente es que usan javascript en el cliente para procesar el html, para verificar que puede descargar la página html y notará que los elementos que están buscando no existen.

Para analizar las páginas en las que primero debe ejecutarse javascript, puede usar un control de navegador web y luego pasar el código html a HAP.

Aquí hay un ejemplo simple sobre cómo usar el control del navegador web WinForms:

private void ParseSomeHtmlThatRenderedJavascript(){
        var browser = new System.Windows.Forms.WebBrowser() { ScriptErrorsSuppressed = true };

        string link = "yourLinkHere";

        //This will be called when the web page loads, it better be a class member since this is just a simple demonstration
        WebBrowserDocumentCompletedEventHandler onDocumentCompleted = new WebBrowserDocumentCompletedEventHandler((s, evt) => {
            //Do your HtmlParsingHere
            var doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(browser.DocumentText);
            var someNode = doc.DocumentNode.SelectNodes("yourxpathHere");
        });

        //subscribe to the DocumentCompleted event using our above handler before navigating
        browser.DocumentCompleted += onDocumentCompleted;

        browser.Navigate(link);
    }

También puede ver Awesomium y algunos otros controles WebBrowser integrados.

Además, si desea ejecutar la aplicación WebBrowser en la consola, aquí hay una muestra, si no obtiene el uso de los formularios de Windows, esta muestra es con la ayuda de esta respuesta del Control WebBrowser en un nuevo hilo.

private void ParseSomeHtmlThatRenderedJavascript(){
        var browser = new System.Windows.Forms.WebBrowser() { ScriptErrorsSuppressed = true };

        string link = "yourLinkHere";

        //This will be called when the web page loads, it better be a class member since this is just a simple demonstration
        WebBrowserDocumentCompletedEventHandler onDocumentCompleted = new WebBrowserDocumentCompletedEventHandler((s, evt) => {
            //Do your HtmlParsingHere
            var doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(browser.DocumentText);
            var someNode = doc.DocumentNode.SelectNodes("yourxpathHere");
        });

        //subscribe to the DocumentCompleted event using our above handler before navigating
        browser.DocumentCompleted += onDocumentCompleted;

        browser.Navigate(link);
    }



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué