【问题标题】:Getting the title of a HTML element with Xpath UWP C#使用 Xpath UWP C# 获取 HTML 元素的标题
【发布时间】:2017-08-22 04:34:11
【问题描述】:

通过这段代码,我得到了 HTLM 文档:

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 Checker for 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;
}

我期望像“Meat”、“Vegatarian”、....这样的值,但我没有得到任何结果。我做错了什么以及如何将 Xpath 与 UWP 一起使用?

更新(21.6.2017):

我终于设法获得了我正在寻找的值:

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

编辑:由于“x:”符号,我的 Firefox Xpath 插件似乎也已过时。没有代码使用它们。

【问题讨论】:

    标签: c# html xpath uwp html-agility-pack


    【解决方案1】:

    我做错了什么以及如何将 Xpath 与 UWP 一起使用?

    根据您的代码 sn-p,您尝试使用的第三方软件包似乎是 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 Url,以便我们进行测试。

    【讨论】:

    • 感谢您的解决方案。我的代码有一天可以工作,然后整个网站都更新了,现在有一个新的 html 格式,但无论如何感谢您的提示。站点是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文本获取的代码我自己写。
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 2013-01-15
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多