perché HTML Agility Pack HtmlDocument.DocumentNode è null?

asp.net c# html-agility-pack

Domanda

Sto usando questo codice per modificare l'attributo href di un flusso HTML.

prima scarro una pagina html completa usando questo codice: (l'URL è l'indirizzo della pagina web)

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

Stream s = myHttpWebResponse.GetResponseStream();

quindi lo elaboro:

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

Stream s = myHttpWebResponse.GetResponseStream();

s è il flusso html.

ma ho un'eccezione che dice doc.DocumentNode è null!

Ho provato molti siti ma doc.DocumentNode è null a

Risposta accettata

Questo funziona per me.

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();
}

Vedi anche HttpUtility.UrlEncode per essere in grado di recuperare correttamente l'url. In caso contrario, alcuni parametri nell'URL originale potrebbero causare problemi.

Utilizzare HttpUtility.UrlDecode per decodificarlo.


Risposta popolare

Il riferimento al tag di ancoraggio è una stringa con escape scorretto:

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

Il codice originale non riesce a selezionare alcun nodo e valuta null; questo dovrebbe essere verificato per evitare errori su, ad esempio, un documento dove non ci sono collegamenti (comunque improbabile che sia :)

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché