2017-06-17 24 views
0

有了這個代碼,我得到的HTLM文件:掌握Xpath的UWP C#中的HTML元素的標題

private static async Task<HtmlDocument> GetHtmlOfPage(string website) 
{ 
      return await new HtmlWeb().LoadFromWebAsync(website); 
} 

元素的XPath是:

id('ContentHolderMain_ContentHolderMainContent_ContentHolderMainContent_pnlDaily')/x:div/x:ol/x:li[3]/x:ul 

(使用XPath檢查器爲Firefox )。

用於檢索值的代碼:

public List<string> GetTypesOfFood(string website) 
{ 
     List<string> TypesOfFood = new List<string>(); 

     HtmlDocument document = GetHtmlOfPage(website).Result; 
     /* HtmlNode docNodes = document.DocumentNode; 
     HtmlNode ul = docNodes.Element("id('ContentHolderMain_ContentHolderMainContent_ContentHolderMainContent_pnlDaily')/x:div/x:ol/x:li[1]/x:ul[@title]");*/ 

     HtmlNode div = document.GetElementbyId("ContentHolderMain_ContentHolderMainContent_ContentHolderMainContent_pnlDaily"); 

     if(div != null) 
     { 
      var ul = div.Element("//div[@class='holderRestaurantInfo']/ol/li[1]/ul/@title").GetAttributeValue("title", "title"); 
      string a = ul; 

      TypesOfFood.Add(a); 
     } 

     return TypesOfFood; 
} 

我期待像 「肉」 的價值觀, 「Vegatarian」,....但我沒有得到任何結果。我做錯了什麼以及如何將Xpath與UWP一起使用?

更新(2017年6月21日):

我終於設法得到我一直在尋找的值:

public List<string> GetTypesOfFood() 
    { 
     if(!InternetConnection) 
     { 
      flag = -3; 
      return null; 
     } 
     List<string> TypesOfFood = new List<string>(); 

     WebResponse response = GetResponse().Result; 
     Stream stream = response.GetResponseStream(); 
     string result = ""; 
     using (StreamReader sr = new StreamReader(stream)) 
     { 
      result = sr.ReadToEnd(); 
     } 


     HtmlDocument MobileDocument = new HtmlDocument(); 
     MobileDocument.LoadHtml(result); 

      var images = MobileDocument.DocumentNode.SelectNodes("//img[@class='pull-right']"); 
      foreach(var image in images) 
      { 
       HtmlAttribute title = image.Attributes[@"title"]; 
       TypesOfFood.Add(title.Value); 
      } 
    return TypesOfFood; 
    } 
    private async Task<WebResponse> GetResponse() 
    { 
     WebRequest req = WebRequest.Create("https://www.studentska-prehrana.si/sl/restaurant/Details/2521"); 
     WebResponse r = await req.GetResponseAsync(); 
      return r; 
    } 

編輯:這似乎也是我的Firefox的XPath插件由於過時「x:」標誌。沒有代碼使用它們。

回答

1

我在做什麼錯了,以及如何在UWP中使用Xpath?

根據你的代碼片段,你似乎試圖使用的第三方軟件包是Html Agility Pack,目前在通用應用程序中尚未完全支持該軟件包。請嘗試使用UWP應用程序支持的HtmlAgilityPack for .NET Core

在UWP中使用Xpath可與您在其他地方所做的相同。例如,使用的HtmlAgilityPack for .NET CoreSelectNodes方法使用XPath串以上如下:

WebRequest request = HttpWebRequest.Create("your uri"); 
WebResponse response = await request.GetResponseAsync(); 
Stream stream = response.GetResponseStream(); 
var result = ""; 
using (StreamReader sr = new StreamReader(stream)) 
{ 
    result = sr.ReadToEnd(); 
} 
HtmlDocument MobileDocument = new HtmlDocument(); 
MobileDocument.LoadHtml(result); 
var nodes = MobileDocument.DocumentNode.SelectNodes("//id('ContentHolderMain_ContentHolderMainContent_ContentHolderMainContent_pnlDaily')/x:div/x:ol/x:li[3]/x:ul]"); 
foreach (var item in nodes) 
{ 
... 
} 

有一個類似的螺紋here還可以引用。如果您仍然有問題,請提供html內容或html網址,讓我們進行測試。

+0

感謝您的解決方案。我的代碼有一天工作,然後整個網站得到更新,現在有一個新的HTML格式,但無論如何感謝提示。該網站是https://www.studentska-prehrana.si/sl/restaurant/Details/2521#和Xpath是: id('menu-list')/ x:div [2]/x:div/x :div/x:div [2]/x:i/x:img 文本抓取的代碼我會自己寫。 – S4NNY1