HTML敏捷包HtmlDocument.DocumentNode为null的原因

本文关键字:null DocumentNode HtmlDocument HTML | 更新日期: 2023-09-27 18:22:33

我正在使用此代码更改HTML流的href属性。

首先,我使用以下代码下载了一个完整的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为空!

我尝试了许多站点,但doc.DocumentNode

HTML敏捷包HtmlDocument.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对其进行解码。

尝试使用//a而不是/a

在XPath中,这基本上意味着给我文档中的所有链接,而不是在文档root中给我所有链接。

更新:

以下代码运行良好:

        var myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://google.com");
        var myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
        var s = myHttpWebResponse.GetResponseStream();
        var doc = new HtmlDocument();
        doc.Load(s);
        foreach (var link in doc.DocumentNode.SelectNodes("//a"))
        {
            var att = link.Attributes["href"].Value;
            link.Attributes["href"].Value = "http://ahmadalli.somee.com/default.aspx?url=" + att;
            Console.WriteLine(link.Attributes["href"].Value);
        }

以下是您的答案:HTML敏捷包空引用。

尝试使用以下代码:

HtmlDocument htmlDoc = new HtmlDocument
        {
            OptionAddDebuggingAttributes = false,
            OptionAutoCloseOnEnd = true,
            OptionFixNestedTags = true,
            OptionReadEncoding = true
        };
        try
        {
            using (Stream reader = myHttpWebResponse.GetResponseStream())
            {
                reader.Seek(0, SeekOrigin.Begin);
                htmlDoc.Load(reader, true);
            }
            HtmlNode node = htmlDoc.DocumentNode;
            if (node != null)
            {
                foreach (var href in doc.DocumentNode.Descendants("a").Select(x =>x.Attributes["href"]))
                 {
                     href.Value = "http://ahmadalli.somee.com/default.aspx?url=" +HttpUtility.UrlEncode(href.Value);
                 }
            }
        }
        catch { }

我正在使用HtmlAgility包版本:1.4.0

解决了你的问题?如果没有,请评论。否则标记为答案。

锚标记引用是一个错误转义的字符串:

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