Html Agility Pack selectnodes返回null

时间:2014-02-24 18:35:25

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

我正在使用Windows Phone 8设备并尝试使用来自http://www.livescience.com/41480-3d-printed-kidneys-take-small-steps.html的html敏捷包解析html文档。我可以轻松获取<title>标记,但现在我想获得整个{{1}该文档中的标记。我尝试了这两个解决方案onetwo,但它不起作用。这是我基于这些解决方案的实际代码

<p>

我使用private void loadDoc() { try { HtmlWeb.LoadAsync("http://www.livescience.com/41480-3d-printed-kidneys-take-small-steps.html", Html_Completed); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void Html_Completed(object sender, HtmlDocumentLoadCompleted e) { doc = e.Document; title = doc.DocumentNode.SelectSingleNode("//title"); p = doc.DocumentNode.SelectNodes("//p"); foreach(var node in p) { pr = node.InnerText; //that's the text you are looking for } text1.Text = title.InnerText; if (!pr.Equals("") && pr != "") { text2.Text = pr; } else { MessageBox.Show("null"); } } 块来确定if是否返回null。有人知道如何解决这个问题吗?我将不胜感激任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

尝试做:

p = doc.DocumentNode.SelectNodes(".//p");

而不是:

p = doc.DocumentNode.SelectNodes("//p");

因为p是一种标记,而不是类或ID。

答案 1 :(得分:0)

您的代码没有任何问题,但它可能没有达到预期效果。 foreach循环遍历所有段落(在提供的URL的情况下总共13个)。因为最后一段是空的,所以pr在最后一次迭代后将为空。

如果你想用text2填充所有段落,你应该改变代码:

pr += node.innerText;

如果您希望pr包含可读文本,则需要解码innerText,因为它可以包含h​​tml实体,如&gt;。你可以这样做:

pr += HtmlEntity.DeEntitize(node.innerText);

希望这有帮助。