C#Html Agility Pack(SelectSingleNode)

时间:2010-09-29 03:04:13

标签: c# html parsing html-agility-pack

我正在尝试解析此字段,但无法使其工作。目前的尝试:

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是一个子节点什么的,这就是为什么我无法读取它?

4 个答案:

答案 0 :(得分:19)

您的代码不起作用的原因是因为页面上的JavaScript实际上写出了<h1 id='profile_name'>标记,所以如果您从用户代理(或通过AJAX)请求该页面不执行JavaScript然后你将找不到元素。

我可以使用以下选择器获取自己的名字:

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

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

 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();

    }

没关系(&#34; // [@href]&#34;);你可以像上面那样试试。希望有用