¿Por qué HTML Agility Pack HtmlDocument.DocumentNode es nulo?

asp.net c# html-agility-pack

Pregunta

Estoy usando este código para cambiar el atributo href de una secuencia HTML.

Primero descargo una página html completa usando este código: (la URL es la dirección de la página web)

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
HttpWebResponse myHttpWebResponse = 
                         (HttpWebResponse)myHttpWebRequest.GetResponse();

Stream s = myHttpWebResponse.GetResponseStream();

entonces yo proceso esto:

HtmlDocument doc = new HtmlDocument();

doc.Load(s);
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("/a"))
{
    string att = link.Attributes["href"].Value;
    link.Attributes["href"].Value = "http://ahmadalli.somee.com/default.aspx?url=" + att;
}
doc.Save(s);

s es html stream.

pero tengo una excepción que dice que doc.DocumentNode es nulo!

doc.DocumentNode intentado muchos sitios pero doc.DocumentNode es nulo para

Respuesta aceptada

Esto funciona para mi

using(WebClient client = new WebClient())
{
    client.Encoding = System.Text.Encoding.UTF8;
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(client.DownloadString("http://www.google.com?q=stackoverflow"));
    foreach (var href in doc.DocumentNode.Descendants("a").Select(x => x.Attributes["href"]))
    {
        if (href == null) continue;
        href.Value = "http://ahmadalli.somee.com/default.aspx?url=" + HttpUtility.UrlEncode(href.Value);
    }
    StringWriter writer = new StringWriter();
    doc.Save(writer);
    var finalHtml = writer.ToString();
}

También vea HttpUtility.UrlEncode para poder recuperar la URL correctamente. De lo contrario, algunos parámetros en la URL original pueden causar problemas.

Usa HttpUtility.UrlDecode para decodificarlo.


Respuesta popular

La referencia de la etiqueta de anclaje es una cadena escapada incorrectamente:

...doc.DocumentNode.SelectNodes("/a")    //incorrect
...doc.DocumentNode.SelectNodes("//a")   //correct
...doc.DocumentNode.SelectNodes(@"/a")   //also correct

El código original no selecciona ningún nodo y se evalúa como nulo; esto debe ser verificado para evitar fallar en, por ejemplo, un documento donde no hay ningún enlace (por muy improbable que sea)

var anchors = doc.DocumentNode.SelectNodes("//a");
if (anchors != null)
{
    foreach (HtmlNode link in anchors)
    {
        /*do stuff*/
    } 
}


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é