C# 为什么HTML Agility Pack HtmlDocument.DocumentNode为空?

C# 为什么HTML Agility Pack HtmlDocument.DocumentNode为空?,c#,asp.net,html-agility-pack,C#,Asp.net,Html Agility Pack,我正在使用此代码更改HTML流的href属性 首先,我使用以下代码下载完整的html页面:(URL是网页地址) 然后我处理这个: HtmlDocument doc = new HtmlDocument(); doc.Load(s); foreach (HtmlNode link in doc.DocumentNode.SelectNodes("/a")) { string att = link.Attributes["href"].Value; link.Attributes[

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

首先,我使用以下代码下载完整的html页面:(URL是网页地址)

然后我处理这个:

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
为空,为

尝试使用
/a
而不是
/a

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

更新:

以下代码可以正常工作:

        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);
        }
这是你的答案:。

这对我很有用

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
对其进行解码。

尝试使用以下代码:

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


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

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

...doc.DocumentNode.SelectNodes("/a")    //incorrect
...doc.DocumentNode.SelectNodes("//a")   //correct
...doc.DocumentNode.SelectNodes(@"/a")   //also correct
原始代码未选择任何节点,计算结果为空;应该检查这一点,以防止在一个根本没有链接的文档上发生故障(尽管可能性不大:)


s
看起来像什么?它是指向完整的HTML文档还是HTML片段?HTML的结构是什么?is是否有
HTML
元素?一个
主体
元素?这是一份有效的文件吗?@Oded它取决于webpage@ahmadali沙菲,我无法重现你的错误
doc.DocumentNode.SelectNodes如果找不到节点,则可以返回
null
。您的xpath表达式似乎没有找到任何节点并返回null。你能粘贴一个完整的代码,在
doc.DocumentNode
上准确地抛出一个
NullReferenceException
吗?不管怎样,doc.DocumentNode是空的,在foreach之前抛出的异常为什么你觉得有必要使用
DocumentNode
?为什么不直接使用
doc.SelectNodes
DocumentNode@ahmadalishafiee你能举一个URL失败的例子吗?或者仅仅是HTML的基本结构?@Ahmadalishafie可能值得注意的是,如果有超过正常数量的呼叫,谷歌会/确实会在IP上设置临时块。如果您在短时间内大量运行代码,那么这可能会导致goog没有返回任何内容。您现在可能应该尝试使用一些其他URL,以消除这一因素。我尝试了您的代码,但有一个例外:
对象引用未设置为对象的实例。
@ahmadalishafie我在另一台计算机上运行它。第一:我用它试过了,效果很好!我尝试使用它,得到了一个null referenceexceptionhref
为空!我添加了
如果(href==null)继续进入循环。
“/a”
@/a”
之间的结果字符串没有区别。
...doc.DocumentNode.SelectNodes("/a")    //incorrect
...doc.DocumentNode.SelectNodes("//a")   //correct
...doc.DocumentNode.SelectNodes(@"/a")   //also correct
var anchors = doc.DocumentNode.SelectNodes("//a");
if (anchors != null)
{
    foreach (HtmlNode link in anchors)
    {
        /*do stuff*/
    } 
}