2016-03-03 16 views
1

我試圖解析HTML網頁, 我會得到一對節點從這個代碼HtmlAgilityPack得到兩個節點同時在C#

<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)標籤都包含相同的子標籤,我 將獲得描述和元素,只有當兩者都存在時

回答

0

AsEnumerableThank大家的幫助 我解決了這個方式

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; 
} 
1

在你的fo R各自如下所示

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

這將只考慮有一個給定類的子節點兩者的div元素,還要注意裏面的XPath你的每一個需要開始尋找從開始decendant節點李節點,所以你需要使用./兒童或.//爲decendants如

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

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

正確的XPath表達式通過CSS類來匹配是有點複雜。以溫和的方式,即張貼在this other answer第二代碼段,用於執行任務的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); 
} 
相關問題