繁体   English   中英

HtmlAgilityPack在C#中同时获取两个节点

[英]HtmlAgilityPack get two nodes simultaneously in c#

我正在尝试解析一个html页面,我将从这段代码中得到一对节点

 <li class="classli"> 
    <div class="element">element1</div>  
    <div class="description">description1</div> 
  </li>  
  <li class="classli"> 
    <div class="element">element2</div>  
    <div class="description">description2</div> 
  </li>  
  <li class="classli"> 
    <div class="xxxelementclass">element3</div>  
    <div class="description">description3</div> 
  </li>  
  <li class="classli"> 
    <div class="element">element4</div>  
    <div class="xxxclass">description4</div> 
  </li> 

我在C#中尝试了这个:

foreach(var node in doc.SelectNodes("//li[contains(@class,classli)]"))
{
    listelement.add(node.SelectSingleNode("//div[contains(@class,element)]").InnerText);
    listdescription(node.SelectSingleNode("//div[contains(@class,description)]").InnerText);
}

在HTML页面中,不是所有的(li)标记都包含相同的子标记,只有在两个标记都存在的地方,我才会获得描述和元素

使您的xpath如下所示

//li[contains(@class,'classli') and ./div[contains(@class,'element')] and ./div[contains(@class,'description')]]

这将只考虑具有给定类的两个div的元素作为子节点,还请注意,每个对象中的xpath需要从li节点开始寻找后代节点,因此您需要对子对象使用././/用于.// ,例如

./div[contains(@class,'element')]

./div[contains(@class,'description')]

通过CSS类匹配正确的XPath表达式有点复杂。 采取适度的方法,即在另一个答案中发布第二个代码段,您的任务的XPath如下(为便于阅读而设置为几行):

var query = @"//li[contains(concat(' ', @class, ' '), ' classli ')]
                  [div[contains(concat(' ', @class, ' '), ' element ')]]
                  [div[contains(concat(' ', @class, ' '), ' description ')]]";

foreach(var node in doc.SelectNodes(query))
{
    var elementQuery = "div[contains(concat(' ', @class, ' '), ' element ')]";
    listelement.add(node.SelectSingleNode(elementQuery).InnerText);

    var descriptionQuery = "div[contains(concat(' ', @class, ' '), ' description ')]";
    listdescription.add(node.SelectSingleNode(descriptionQuery).InnerText);
}

AsEnumerable谢谢大家我以这种方式解决的帮助

    foreach(var node in doc.SelectNodes("//li[contains(@class,classli)]"))
    {

   List<HTMLNODE> Child = node.childnodes.where(o=> (o.getattribbutevalue(class,"") == "element") or (o.getattribbutevalue(class,"") == "description")).AsEnumerable().ToList();

    }

For(int i = 0; i <= Child.count-1;i=i+2)
{
listelement.add(Child[i].InnerHtml;
listdescription.add(Child[i+1].InnerHtml;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM