如何選擇包含某些關鍵字的表 - c# - xpath - htmlagilitypack

c# html-agility-pack keyword select xpath

我必須從沒有任何類或ID的產品頁面收集信息。我正在使用htmlagilitypack和c#4.0。

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

下面的xpath將選擇所有表格

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

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

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

c#,xpath,htmlagilitypack

一般承認的答案

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

使用

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

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

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

如果您只想選擇其中一個(比如第一個),請使用此XPath表達式 - 請注意括號

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

記住 :如果要在文檔中選擇第一個someName元素,使用它(如當前接受的答案中)是錯誤的:

//someName[1]

這是XPath中第二個最常見的FAQ(在使用默認命名空間的XML文檔中選擇具有無前綴名稱的元素之後)。

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

這種不直觀行為的原因是因為XPath []運算符的優先級(優先級)高於//偽運算符。

真正選擇第一個someName元素(在任何XML文檔中)的正確表達式(如果存在)是:

(//someName)[1]

這裡括號用於顯式覆蓋默認的XPath運算符優先級。


熱門答案

可能有一種更有效的方法。無論如何,這是我用於你的案例的整個代碼,它適用於我:

        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);


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因