使用C#中的HtmlAgilityPack在其他元素中获取特定元素

时间:2013-05-05 19:57:50

标签: c# html mono

我正在开发一个需要解析大量html文件的项目。我需要从一个<p>

中获取每个<div class="story-body">

到目前为止,我有这个代码并且它可以实现我想要的功能,但我想知道如何使用xpath表达式执行此操作。我试过这个:

textBody.SelectNodes ("What to put here? I tried //p but it gives every p in document not inside the one div")

但没有成功。有什么想法吗?

public void Parse(){
   HtmlNode title = doc.DocumentNode.SelectSingleNode ("//h1[(@class='story-header')]");
   HtmlNode textBody = doc.DocumentNode.SelectSingleNode ("//div[(@class='story-body')]");

   XmlText textT;
   XmlText textS;

   string story = "";

   if(title != null){
     textT = xmlDoc.CreateTextNode(title.InnerText);
     titleElement.AppendChild(textT);
     Console.WriteLine(title.InnerText);
   }

   foreach (HtmlNode node in textBody.ChildNodes) {
      if(node.Name == "p" || (node.Name == "span" && node.GetAttributeValue("class", "class") == "cross-head")){
         story += node.InnerText + "\n\n";
         Console.WriteLine(node.InnerText);
      }
   }

   textS = xmlDoc.CreateTextNode (story);

   storyElement.AppendChild (textS);

   try
   {
        xmlDoc.Save("test.xml");            
   }
   catch (Exception e)
   {
        Console.WriteLine(e.Message);
   }
}

1 个答案:

答案 0 :(得分:0)

这是一个相当简单的事情,您只需要在.之类的字符串中添加.//p,这样您就只能得到当前节点的子节点。

另一种方法是像这样调用SelectNodes:

doc.DocumentNode.SelectNodes("//div[(@class='story-body')]/p");