2014-05-25 57 views
1

這是一個約食物開放DATABSE頁:選擇在表中的所有textnodes使用XPath

http://www.dabas.com/ProductSheet/Details.ashx/121308

林試圖從使用XPath此頁面的一些信息。 我感興趣的表格叫做Näringsvärde。 我想獲取保存爲字符串的「N​​äringsvärde」內的所有textnode。

這所鏈接的代碼的相關部分的上方:

<!DOCTYPE html> 
<html> 
... 
<body> 
... 
<table class="width100" style="page-break-inside: avoid"> 
    <caption> 
     Produktinformation 
      <img src="../../images/ProductSheet/draw-triangle3.png" id="toggleProduktinformation" 
       class="imgCaptionOn" /> 
    </caption> 
    <tbody id="tbodyProduktinformation"> 
     <tr> 
      <td class="col1"> 
       Ursprungsland: 
      </td> 
      <td> 
Sverige   </td> 
     </tr> 
     ... 
    </tbody> 
</table> 

<table id="tableHover" class="width100 marginTop30 bgTable"> 
<tr class="nohover"> 

<td class="tdLeft48 padding0"> 
    <table id="nutritiveTabel" class="leftTable" style="page-break-inside: avoid"> 
     <caption> 
      Näringsvärde 
       <img src="../../images/ProductSheet/draw-triangle3.png" id="toggleNutritiveValues" 
        class="imgCaptionOn" /> 
     </caption> 
     <tbody id="tbodyNutritiveValues"> 
      <tr id="divNutritiveValues"> 
       <td class="padding"> 
        <table class="noBorder width100"> 
          <tr> 
           <td class="col1"> 
            Tillagningsstatus: 
           </td> 
           <td>Tillagad</td> 
           <td colspan="2"> 
            &amp;amp;nbsp; 
           </td> 
          </tr> 
         ... 
        </table> 
       </td> 
      </tr> 
     </tbody> 
    </table> 
</td> 
... 
</html> 

我試圖用這樣的事情,到目前爲止,但它沒有工作:

public List<string> GetNaring(string xid) {   
    HtmlWeb web = new HtmlWeb(); 
    HtmlDocument doc = web.Load(xid); 
    var xpath = "/html/body/div/div[2]/div[2]/table[2]/tbody/tr/td/table/tbody"; 
    var links = doc.DocumentNode.SelectNodes(xpath); 
    return links.Select(n => n.InnerText).ToList(); 

}

但是這隻能給我回復null,我錯過了什麼?

回答

1

XPath表達式:

/html/body/div/div[2]/div[2]/table[2]/tbody/tr/td/table/tbody 

不匹配任何節點。

既然你有一個唯一的字符串,你可以匹配,你應該使用它。搜索源代碼串,你會發現:

... 
<td class="tdLeft48 padding0"> 
    <table id="nutritiveTabel" class="leftTable" style="page-break-inside: avoid"> 
     <caption> 
      Näringsvärde 
       <img src="../../images/ProductSheet/draw-triangle3.png" id="toggleNutritiveValues" 
        class="imgCaptionOn" /> 
     </caption> 
     <tbody id="tbodyNutritiveValues"> 
      <tr id="divNutritiveValues"> 
... 

的字符串是你想要的表內caption元素的子元素。您必須獲取該元素的字符串值,修剪多餘的空格並使用結果與「Näringsvärde」進行比較。您可以選擇正確的table使用這個表達式:

//table[normalize-space(caption/text())='Näringsvärde'] 

一旦你有了正確的表,你可以在它裏面瀏覽和選擇所需的節點,或者你可以得到字符串值這是一個級聯的所有後代文本節點:

//table[normalize-space(caption/text())='Näringsvärde']//td 

這將返回所有td節點,這就是文字。

+0

非常感謝你的代碼和課程!它工作完美,我一定會在下次再次訪問這個問題! – user2915962

+0

林不知道爲什麼,但這段代碼給了所有信息兩次..,你有什麼想法可能是什麼?也許在其他地方出錯了? – user2915962

+1

如果信息未在原始文件中複製,則問題不在XPath表達式中。 – helderdarocha