Pregunta

Estoy intentando usar el paquete de agilidad HTML para buscar palabras clave específicas en Google, luego verificar a través de nodos vinculados hasta que encuentre la URL de la cadena de mis sitios web, luego analice el interno del nodo que estoy en mi clasificación de Google.

Soy relativamente nuevo en el paquete de agilidad (como en, comencé a mirarlo ayer), así que esperaba poder obtener ayuda. Cuando hago la búsqueda a continuación, recibo fallas en mis consultas XPath cada vez. Incluso si inserto algo tan simple como selectNodes ("//*[@id = 'rso']). ¿Es esto algo que estoy haciendo incorrectamente?

    private void GoogleScrape(string url)
    {
        string[] keys = keywordBox.Text.Split(',');
        for (int i = 0; i < keys.Count(); i++)
        {
            var raw = "http://www.google.com/search?num=100&q=";
            string search = raw + HttpUtility.UrlEncode(keys[i]);
            var webGet = new HtmlWeb();
            var document = webGet.Load(search);
            loadtimeBox.Text = webGet.RequestDuration.ToString();

            var ranking = document.DocumentNode.SelectNodes("//*[@id='rso']");

            if (ranking != null)
            {
                googleBox.Text = "Something";
            }
            else
            {
                googleBox.Text = "Fail";
            }
           }
          }
¿Fue útil?

Solución

No es la culpa del paquete de agilidad, es difícil de Google. Si inspecciona la propiedad _text de htmlDocument con debugger, encontrará que <ol> que tiene id='rso' Cuando lo inspeccione en un navegador, no tiene ningún atributo por alguna razón.

Creo que, en este caso, puedes simplemente Serach por "// ol", porque solo hay uno <ol> Etiqueta en la página de resultados de Google en este momento ...

ACTUALIZACIÓN: He hecho más cheques. Por ejemplo, cuando hago esto:

using (StreamReader sr = 
        new StreamReader(HttpWebRequest
          .Create("http://www.google.com/search?num=100&q=test")
          .GetResponse()
          .GetResponseStream()))
{
    string s = sr.ReadToEnd();
    var m2 = Regex.Matches(s, "\\sid=('[^']+'|\"[^\"]+\")");
    foreach (var x in m2)
        Console.WriteLine(x);
}

Los únicos IDS que se devuelven son: "SFLAS", "Hidden_Modes" y "TBPR_12".

Para concluir: he usado el paquete de agilidad HTML y se ha afrontado bastante bien incluso con HTML malformado (no cerrado <p> e incluso <li> etiquetas etc.).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top