pourquoi HTML Agility Pack HtmlDocument.DocumentNode est null?

asp.net c# html-agility-pack

Question

J'utilise ce code pour changer l'attribut href d'un flux HTML.

D'abord, je télécharge une page html complète à l'aide de ce code:

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

Stream s = myHttpWebResponse.GetResponseStream();

alors je traite ceci:

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 est flux HTML.

mais j'ai une exception qui dit que doc.DocumentNode est null!

J'ai essayé de nombreux sites, mais doc.DocumentNode est null à

Réponse acceptée

Cela fonctionne pour moi.

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

Consultez également le HttpUtility.UrlEncode pour pouvoir récupérer l'URL correctement. Sinon, certains paramètres de l'URL d'origine peuvent poser problème.

Utilisez HttpUtility.UrlDecode pour le décoder.


Réponse populaire

La référence de balise d'ancrage est une chaîne échappée de manière incorrecte:

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

Le code d'origine ne sélectionne aucun noeud et est évalué à null; il convient de vérifier cette option pour éviter l'échec, par exemple, d'un document dans lequel il n'y a aucun lien (même si cela est peu probable :)

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi