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 à
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.
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*/
}
}