Análisis con Async, HtmlAgilityPack y XPath

asynchronous c# html-agility-pack web-scraping xpath

Pregunta

Me he encontrado con un problema bastante extraño. Es muy difícil de explicar, así que tenga paciencia conmigo, pero básicamente aquí hay una breve introducción:

  • Soy nuevo en la programación de Async pero no pude localizar un problema en mi código
  • He usado HtmlAgilityPack antes, pero nunca la versión .NET 4.5.
  • Este es un proyecto de aprendizaje, no estoy tratando de raspar ni nada de eso.

Básicamente, lo que está sucediendo es esto: estoy recuperando una página de Internet, la estoy cargando a través de un flujo en un documento HtmlDocument , y luego HtmlNodes recuperando ciertos HtmlNodes usando expresiones XPath . Aquí hay un pedazo de código simplificado:

            myStream = await httpClient.GetStreamAsync(string.Format("{0}{1}", SomeString, AnotherString);

            using (myStream)
            {
                myDocument.Load(myStream);
            }

El HTML se está recuperando correctamente, pero los HtmlNodes extraídos por XPath están modificando su HTML. Aquí hay una muestra de HTML que obtuve en una respuesta tomada de Fiddler:

            myStream = await httpClient.GetStreamAsync(string.Format("{0}{1}", SomeString, AnotherString);

            using (myStream)
            {
                myDocument.Load(myStream);
            }

El XPath que estoy usando es 100% correcto porque funciona en el navegador en la misma página, pero aquí hay un ejemplo de a etiqueta que está volviendo a extraer de la página que se muestra anteriormente:

            myStream = await httpClient.GetStreamAsync(string.Format("{0}{1}", SomeString, AnotherString);

            using (myStream)
            {
                myDocument.Load(myStream);
            }

Y aquí está el original que copié de arriba para simplificar:

            myStream = await httpClient.GetStreamAsync(string.Format("{0}{1}", SomeString, AnotherString);

            using (myStream)
            {
                myDocument.Load(myStream);
            }

Como puede ver, el texto interno ha cambiado considerablemente y también la URL. Obviamente mi programa no funciona, pero no sé cómo. ¿Qué puede causar esto? ¿Es un error en HtmlAgilityPack? ¡Por favor avise! ¡Gracias por leer!

Respuesta aceptada

Después de muchas horas de adivinar y depurar, el problema resultó ser un HtmlDocument que estaba reutilizando. HtmlDocument el problema creando un nuevo documento HtmlDocument cada vez que quería cargar una página nueva, en lugar de usar la misma.

Espero que esto te ahorre tiempo que perdí!


Respuesta popular

No asuma que una expresión XPath funciona en su navegador ( después de la conversión de DOM , posiblemente cargando datos con AJAX, ...). Este parece ser un sitio que ofrece cotizaciones de apuestas. Supongo que están cargando los datos con algunas llamadas de JavaScript.

Verifique si su expresión XPath coincide con el código fuente de las páginas (como las que se obtienen con wget o haciendo clic en "Ver código fuente" en su navegador: ¡no use Firebug / ... para esto!

Si el sitio utiliza AJAX para cargar los datos, es posible que tenga suerte al usar Firebug para monitorear qué recursos se obtienen mientras se carga la página. A menudo, estos son archivos JSON o XML muy fáciles de analizar, y es incluso más fácil trabajar con ellos que analizar un sitio web de horribles errores de HTML.

Actualización: en este caso especial, el sitio reenvía a los usuarios que no envían un encabezado Accept-Language a una página de selección de idioma. Envíe dicho encabezado para recibir el mismo contenido que el navegador. En rizo, se vería así:

curl -H "Accept-Language: en-US;q=0.6,en;q=0.4" https://mobile.bet365.com/sport/splash/Default.aspx?Sport



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é