0

我有一个 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);

        }
    }

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

** 南区首席买家

具有德语母语水平的客户服务订单管理

EMEA 客户体验和质量实习

德语和法语水平优秀的服务台组长

具有法语母语水平的采购顾问

Jefe/a de ventas con alemán e inglés。Recien Titulados。

Jefe/a de ventas con alemán e inglés。Recien Titulados。

Jefe/a de ventas con alemán e inglés。Recien Titulados。

位置1=阿尔梅里亚

位置 1=特拉萨

位置 1=英国,曼彻斯特

位置 1=巴塞罗那

位置 1=巴塞罗那

Location1=拉科鲁尼亚

位置 1=加泰罗尼亚

位置 1=穆尔西亚 **

上面的代码可以正确地获取数据。问题是我想在数据库中插入上述数据,并且还想以正确的格式显示数据意味着财产的第一个标题,然后是它的位置 **Lead Buyer South Location1=Almeria

具有德国本地级别的客户服务订单管理 Location1=Terrassa

EMEA 客户体验和质量实习地点 1=英国,曼彻斯特

德语和法语水平优秀的服务台团队负责人 Location1=Barcelona

具有法国本地水平的采购和采购顾问 Location1=Barcelona

Jefe/a de ventas con alemán e inglés。Recien Titulados。Location1=拉科鲁尼亚

Jefe/a de ventas con alemán e inglés。Recien Titulados。位置 1=加泰罗尼亚

Jefe/a de ventas con alemán e inglés。Recien Titulados。位置 1=穆尔西亚**

通过搜索表标签的替代方法

 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 次

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

4

2 回答 2

0

乍一看,您可能只需将它们都存储在数组中,然后在输出时从每个数组中获取一个项目。

更稳健、更正确地,您应该细化您的搜索,以便找到其中包含两条信息的 html 元素(例如,搜索具有“border-jobs”类的表。这包含职位和位置。然后您可以同时从中获取两条数据。

这种技术更好,因为它可以更好地处理诸如未指定位置之类的事情,并且通常可以更好地反映您正在做的事情,这样下一个人会更容易理解。

添加

要回答您的其他问题,请参阅此行:

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

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

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

请注意对对象的更改(您已经从注释中知道)以及.在 XPath 中添加的告诉它从当前节点开始的内容。

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

于 2013-11-14T11:51:37.793 回答
0

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

于 2013-11-15T05:54:54.487 回答