2014-03-31 199 views
0

我使用htmlagilitypack和xpath爲特定關鍵字刮取網頁。我一次遇到搜索多個關鍵字的麻煩。xpath搜索多個關鍵字

,所以我已經得到了關鍵字的東西的代碼是(與隨機選擇的關鍵字:冷凍和奧巴馬醫改):

HtmlDocument doc = new HtmlDocument(); 
HtmlWeb web = new HtmlWeb(); 
doc = web.Load(uri); 
HtmlNodeCollection Nodes = doc.DocumentNode.SelectNodes("//text()[contains(., 'Frozen obamacare')]"); 

雖然我知道在特定的頁面,這並不甚至工作同時擁有關鍵字,並從其他調查結果中基本獲知SelectNodes("//text()[contains(., 'Frozen obamacare')]");是多個關鍵詞的正確方法。

我需要幫助驗證這是否是使用多個關鍵字的正確方法,如果不是,那麼我正在尋找幫助來糾正它。

+2

你使用沒有搜索多個關鍵字查詢,其搜索的字符串'凍結obamacare'。試試這個'//text()[contains(.,'Frozen')幷包含(。''obamacare')]' – deanosaur

+0

我選擇了Jens Erat的答案,因爲它現在可以工作,即使XPath 2.0的功能可能是最好的我必須改變我正在使用的內容或修復嘗試XPath 2.0內容時出現的錯誤。謝謝大家的所有幫助。你們真棒! – shadonar

回答

1

這將檢索包含字符串'Frozen obamacare'的所有文本節點。它不會標記爲單詞或任何東西。例如符合您查詢的是:

  • 冷凍奧巴馬醫改
  • fooFrozen obamacarebar

它不會匹配:

  • 冷凍富奧巴馬醫改
  • 冷凍,奧巴馬醫改
  • 等。

要匹配XPath 1.0中包含兩個標記串,使用

//text()[contains(., 'Frozen') and contains(., 'obamacare')] 

HTML敏捷性包僅支持XPath 1.0,所以你不能使用XPath 2.0的更高級的符號化功能。

+0

由於HTML Agility Pack僅支持XPath 1.0,爲了獲得Agility Pack具有的HTML文檔功能,我可以如何使用XPath 2.0? – shadonar

+0

有許多可以從.net接口的XQuery/XPath 2.0處理器。看看提供本地功能的Saxon。 BaseX也有接口。 Theres是另一個本地.net庫,但我現在不記得名字了。順便說一下,我的答案實際上是關於XPath 1.0的。在XPath 2.0中,您可以在源字符串上使用'tokenize'。 –

1

您的XPath //text()[contains(., 'Frozen obamacare')]從字面上檢查包含字符串Frozen obamacare的文本節點。

您可能想要檢查您是否可以使用XPath 2.0或XQuery 1.0作爲您可以使用的方式。 //text()[matches(., 'Frozen|obamacare')]或考慮使用.NET和HTML敏捷性包的LINQ支持正則表達式的支持,你可以使用

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading.Tasks; 
using HtmlAgilityPack; 

namespace ConsoleApplication63 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      HtmlWeb web = new HtmlWeb(); 
      HtmlDocument doc = web.Load("http://stackoverflow.com/questions/22767900/xpath-search-for-multiple-keywords"); 

      foreach (HtmlTextNode text in doc.DocumentNode.Descendants().OfType<HtmlTextNode>().Where(n => Regex.IsMatch(n.InnerText, @"\b(Frozen|obamacare)\b"))) 
      { 
       Console.WriteLine("Found \"{0}\"", text.InnerText); 
      } 
     } 
    } 
} 
+0

這實際上是否與HTML敏捷包一起工作(我問,因爲我將它看作是使用語句的一部分)? – shadonar

+0

@shadonar,是的,當然,這是使用從NuGet獲取的最新版本的HTML敏捷包進行測試的代碼。 –