почему HTML Agility Pack HtmlDocument.DocumentNode имеет значение NULL?

asp.net c# html-agility-pack

Вопрос

Я использую этот код, чтобы изменить атрибут href потока HTML.

сначала я загружаю полную html-страницу, используя этот код: (URL-адрес веб-страницы)

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

Stream s = myHttpWebResponse.GetResponseStream();

то я обрабатываю это:

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 - поток html.

но у меня есть исключение, которое говорит, что doc.DocumentNode имеет значение null!

Я пробовал много сайтов, но doc.DocumentNode имеет значение null

Принятый ответ

Это работает для меня.

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

Также см. HttpUtility.UrlEncode чтобы иметь возможность правильно вернуть URL-адрес. В противном случае некоторые параметры исходного URL могут вызвать проблемы.

Используйте HttpUtility.UrlDecode для его декодирования.


Популярные ответы

Ссылка на привязную привязку - это строка с неправильной экранировкой:

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

Исходный код не может выбрать любые узлы и оценивает значение null; это нужно проверить, чтобы предотвратить провал, скажем, документа, где вообще нет ссылок (хотя маловероятно, что это :)

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


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow