C#Html敏捷包(SelectSingleNode)

问题描述:

我试图解析这个字段,但不能让它工作。当前尝试:C#Html敏捷包(SelectSingleNode)

var name = doc.DocumentNode.SelectSingleNode("//*[@id='my_name']").InnerHtml; 


<h1 class="bla" id="my_name">namehere</h1> 

错误:未将对象引用设置为对象的实例。

感谢任何帮助。

@John - 我可以保证HTML正确加载。我正在尝试阅读我的Facebook名称以进行学习。这里是Firebug插件的截图。我使用的版本是1.4.0。

http://i54.tinypic.com/kn3wo.jpg

我想这个问题是profile_name为一个子节点或什么的,这就是为什么我不能读它?

+0

你试过调试吗?你的代码失败了什么?你写的代码能正常工作。 – 2010-09-29 03:53:14

+0

我发布了它失败的行。 – josh 2010-09-29 15:23:41

+0

你能展示加载你的HTML的代码吗?另外,链中的哪个对象为空?你有多个具有相同ID的H1标签吗?你使用的是什么版本的HTML敏捷包? – 2010-09-29 16:07:46

试试这个:

var name = doc.DocumentNode.SelectSingleNode("//@id='my_name'").InnerHtml; 
+0

不起作用。 “表达式必须评估为一个节点集。” – josh 2010-09-29 15:24:43

您的代码不工作的原因是因为有是实际写出<h1 id='profile_name'>标签页面上的JavaScript,所以如果你从一个用户请求页面代理(或通过AJAX),不执行JavaScript,那么你不会找到该元素。

我可以使用下面的选择让我自己的名字:

string name = 
    doc.DocumentNode.SelectSingleNode("//a[@id='navAccountName']").InnerText; 
+0

这应该被标记为答案。这实际上帮助了我。动态生成的代码不能在此dll中工作。 – 2012-06-29 21:09:01

HtmlAgilityPack.HtmlNode name = doc.DocumentNode.SelectSingleNode("//h1[@id='my_name']").InnerText; 

public async Task<List<string>> GetAllTagLinkContent(string content) 
    { 


     string html = string.Format("<html><head></head><body>{0}</body></html>", content); 
     HtmlDocument doc = new HtmlDocument(); 
     doc.LoadHtml(html); 
     var nodes = doc.DocumentNode.SelectNodes("//[@id='my_name']"); 
     return nodes.ToList().ConvertAll(r => r.InnerText).Select(j => j).ToList(); 

    } 

这是确定用( “// A [@href]”);你可以像上面一样试试。希望对你有帮助