如何使用HTML敏捷性以正确的格式显示数据

时间:2013-11-14 09:41:26

标签: c# asp.net html-agility-pack

我有一个HTML文档,并希望获取必要的信息,因此使用了HTML敏捷性概念。 使用以下代码获取所有必要的数据。

  var web = new HtmlWeb();
    var doc = web.Load("http://www.talentsearchpeople.com/en/jobs/?page=joblisting&pubID=&formID=&start=0&count=8&module=&functionLevel1=&provinceNode=&countryNode=&keyword=");

    var nodes = doc.DocumentNode.SelectNodes("//a[@class='grijs'][@title]");

    foreach (var node in nodes)
    {
        HtmlAttribute att = node.Attributes["title"];
        title = att.Value;
        Response.Write("<br/>" + att.Value);

    }




    var Location = doc.DocumentNode.SelectNodes("//td[@width='80']");

    foreach (var node in Location)
    {
        if (node.InnerHtml.Contains("Location:"))
        {
            locationname = HttpUtility.HtmlDecode(node.NextSibling.NextSibling.InnerText.Trim());

            Response.Write("<br/>Location1=" + locationname);

        }
    }

使用上面的代码得到以下输出:

** Lead Buyer South

原生德语水平的客户服务订单管理

EMEA客户体验&amp;质量实习

服务台团队负责人,具有优秀的德语和法语水平

采购&amp;具有本地法语水平的采购顾问

Jefe / a de ventas conalemángelés。 Recien Titulados。

Jefe / a de ventas conalemángelés。 Recien Titulados。

Jefe / a de ventas conalemángelés。 Recien Titulados。

LOCATION1 =阿尔梅里亚

LOCATION1 =特拉萨

位置1 =英国,曼彻斯特

LOCATION1 =巴塞罗那

LOCATION1 =巴塞罗那

Location1 =ACoruña

LOCATION1 =加泰罗尼亚

LOCATION1 =穆尔西亚 **

上面的代码可以正常地获取数据。问题是我想在数据库中插入上面的数据,并且还希望以正确的格式显示数据意味着属性的第一个标题,后跟其位置 ** Lead Buyer South LOCATION1 =阿尔梅里亚

具有原生德语水平的客户服务订单管理 LOCATION1 =特拉萨

EMEA客户体验&amp;质量实习 位置1 =英国,曼彻斯特

服务台团队负责人,具有优秀的德语和法语水平 LOCATION1 =巴塞罗那

采购&amp;采用本地法语水平的采购顾问 LOCATION1 =巴塞罗那

Jefe / a de ventas conalemángelés。 Recien Titulados。 Location1 =ACoruña

Jefe / a de ventas conalemángelés。 Recien Titulados。 LOCATION1 =加泰罗尼亚

Jefe / a de ventas conalemángelés。 Recien Titulados。 LOCATION1 =穆尔西亚**

搜索表格标签的替代方法

 var web = new HtmlWeb();
    var doc = web.Load("http://www.talentsearchpeople.com/en/jobs/?page=joblisting&pubID=&formID=&start=0&count=8&module=&functionLevel1=&provinceNode=&countryNode=&keyword=");
    var mainNode = doc.DocumentNode.SelectNodes("//table[@class='border-jobs']/*");
    foreach (var mainNodes in mainNode)
    {
        string pathdet = mainNodes.XPath;
        var nodes = mainNodes.SelectSingleNode("//a[@class='grijs'][@title]");
        if (nodes != null)
        {
            HtmlAttribute att = nodes.Attributes["title"];
            title = att.Value;
            Response.Write("<br/>" + att.Value);
        }


        var Description = doc.DocumentNode.SelectSingleNode("//td[@colspan='2']");
        if (Description.InnerHtml.Contains("Description:"))
        {
            s = Description.InnerHtml;
            s = s.Replace("Description:", "");
            Response.Write("<br/>Description=" + s);
        }


        var Location = doc.DocumentNode.SelectSingleNode("//td[@width='80']");


        if (Location.InnerHtml.Contains("Location:"))
        {
            locationname = HttpUtility.HtmlDecode(Location.NextSibling.NextSibling.InnerText.Trim());

            Response.Write("<br/>Location1=" + locationname);

        }
    }

如果我使用上面的代码,那么我得到以下输出:

助理呼叫中心经理,能说流利的西班牙语和英语

描述=我们正在为位于葡萄牙里斯本的一家跨国公司招聘一名助理呼叫中心经理。这个人将负责团队管理。团队管理经验,主要是联络中心,环境是必需的。

Location1 =葡萄牙里斯本

我得到上面的输出8次 // table [@ class ='border-jobs'] / * 标记在文档中出现8次

我怎样才能得到正确的输出?

2 个答案:

答案 0 :(得分:0)

一眼就看起来你可能只是将它们存储在数组中然后在输出时从每个数组中获取一个项目。

更强大,更正确,您应该优化搜索,以便找到包含两条信息的html元素(例如,搜索带有“border-jobs”类的表。这包含作业标题和位置。然后,您可以同时从中获取两个数据。

这种技术更好,因为它可以更好地处理没有指定位置的事情,并且通常更能反映你正在做的事情,因此下一个人会更容易理解。

<强>加成

要回答您的其他问题:

var Description = doc.DocumentNode.SelectSingleNode("//td[@colspan='2']");

将搜索整个文档。要让它搜索正确的节点,只搜索您需要的那个节点的内容:

var Description = mainNodes.SelectSingleNode(".//td[@colspan='2']");

注意对象的更改(您已经从注释中了解到)以及在XPath中添加.,它告诉它从当前节点开始。

此外,您的标题选择将无法在该节点中找到任何有效内容,因此您需要更新XPath。将其更改为.//a将起作用,因为它是第一个锚标记,但这可能有点脆弱。

答案 1 :(得分:0)

我得到了答案。 :) 因为//返回整个页面上的第一个td [@colspan ='2'],而不是表中的那个。 使用XPath“。”在表达式前面会选择当前节点   var Description = mainNodes.SelectSingleNode(“.// tr // td // table // tr // td [@colspan ='2']”); 将仅选择mainNodes节点的后代。