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
对
这对我有用。
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*/
}
}