C# 为什么HTML Agility Pack HtmlDocument.DocumentNode为空?
我正在使用此代码更改HTML流的href属性 首先,我使用以下代码下载完整的html页面:(URL是网页地址) 然后我处理这个: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[
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*/
}
}