2011-12-25 41 views
3

我必須從沒有任何類別或id的產品頁面收集信息。我正在使用htmlagilitypack和c#4.0。如何選擇包含特定關鍵字的表格 - c# - xpath - htmlagilitypack

此產品頁面源代碼中有許多表。價格表包含「KDV」字符串。所以我想獲得這個包含表格的「KDV」字符串。我怎樣才能做到這一點 ?下面

中的XPath將選擇所有表例如

string srxPathOfCategory = "//table"; 
var selectedNodes = myDoc.DocumentNode.SelectNodes(srxPathOfCategory); 

下面的代碼選擇表,但大多數外表開始。我需要選擇其中包含給定的字符串

//table[contains(., ' KDV')] 

C#,XPath的,htmlagilitypack

+0

你的意思是CDV? –

+0

請問什麼是CDV? – MonsterMMORPG

+0

逗號分隔值 –

回答

4

下面的代碼選擇表,但最外層的表開始。我 需要選擇其中包含給定的字符串

使用最內表:

//table 
    [not(descendant::table) 
    and 
    .//text()[contains(., ' KDV')] 
    ] 

這裏選擇不具有table後代的XML文檔中的任何table,並具有包含字符串" KDV"的文本節點後代。

通常上述表達式可以選擇許多這樣的table元素。

如果你只想選擇其中之一(說第一),使用此XPath表達式 - 你注意到括號

(//table 
     [not(descendant::table) 
     and 
     .//text()[contains(., ' KDV')] 
     ] 
    )[1] 

記住:如果您要選擇的第一someName在文檔中元素,使用這種(如目前公認的答案)是錯誤的:

//someName[1] 

這是XPath的第二個最常見問題解答(一前一後如何選擇eleme在具有默認命名空間的XML文檔中帶有前綴名的nts)。

上面的表達式實際上選擇文檔中的任何someName元素,即它的父項的第一個子項 - 嘗試它。

此直觀行爲的原因是因爲XPath []運算符具有較高的優先級(優先級),即//僞運算符。

正確表達,真正僅選擇所述第一someName元件(任何XML文檔中),如果這樣的存在是:

(//someName)[1] 

在這裏,括號用於明確地覆蓋默認的XPath運算符優先級。

+0

我不得不說,你是最好的:)所以這個預測是選擇那張桌子。爲了選擇它的TD作爲節點,我該怎麼做?謝謝你:http://pastebin.com/2hHxUHa8 – MonsterMMORPG

+0

@MonsterMMORPG:不客氣。爲了選擇表的td s,只需在末尾添加/ td:'(// table [not(descendant :: table)and .// text()[contains(。,'KDV')]])[1 ]/descendant :: td [1]'選擇該表的第一個「td」。 –

1

有可能是做一個更有效的方法最內表。無論如何, 這是我用你的情況下,整個代碼和它的作品對我來說:

 HtmlDocument doc = new HtmlDocument(); 
     string url = "http://www.pratikev.com/fractalv33/pratikEv/pages/viewProduct.jsp?pInstanceId=3138821"; 
     using (var response = (WebRequest.Create(url).GetResponse())) 
     { 
      doc.LoadHtml(new StreamReader(response.GetResponseStream()).ReadToEnd()); 
     } 
     /*There is an bug in the xpath used here. Should have been 
      (//table/tr/td/font[contains(.,'KDV')])[1]/ancestor::table[2] 
      See Dimitre's answer for an explanation and an alternative/
      more generic/(needless to say) better approach */ 
     string xpath = "//table/tr/td/font[contains(.,'KDV')][1]/ancestor::table[2]"; 
     HtmlNode table = doc.DocumentNode.SelectSingleNode(xpath); 
+0

嘗試過它爲空:) – MonsterMMORPG

+0

這個選擇表,但它開始從最外層選擇。我需要選擇最內表,它是指含有表KDV的第一個親本://表[含有(「KDV」)] – MonsterMMORPG

+0

其源代碼是可怕:http://pastebin.com/CrFCxdBh – MonsterMMORPG

相關問題