Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抓取时间表HTMLAgilityPack_C#_Html_Html Agility Pack - Fatal编程技术网

C# 抓取时间表HTMLAgilityPack

C# 抓取时间表HTMLAgilityPack,c#,html,html-agility-pack,C#,Html,Html Agility Pack,我需要从网站上拿一张时间表。我想将此时间表存储/添加到我的C#应用程序中的数据表中 数据表的结构如下所示: 1. | Day | Time | Status | 2. ..1.......7:00.........IN 3. ..1.......9:45.......OUT 4. ..1......10:15........IN 5. ..1......15:45......OUT 6. ..1.......8:45.....TOTAL 7. ..2 .. ..

我需要从网站上拿一张时间表。我想将此时间表存储/添加到我的C#应用程序中的数据表中

数据表的结构如下所示:

1. | Day | Time | Status | 2. ..1.......7:00.........IN 3. ..1.......9:45.......OUT 4. ..1......10:15........IN 5. ..1......15:45......OUT 6. ..1.......8:45.....TOTAL 7. ..2 .. .. 我尝试了不同的变体,我总是把所有的数据搞乱

出于测试目的,我制作了一个新的Winform,其中包含“textbox”(用于站点路径)和“button”(用于启动流程)

然后我想让HTMLAgilityPack获取所有数据。一个例子:

public string[] GREYsource;

public Form1()
{
    InitializeComponent();
}

private void btnSubmit_Click(object sender, EventArgs e)
{
    var doc = new HtmlAgilityPack.HtmlDocument();
    var fileName = txtPath.Text;                    // I downloaded the HTML-File
    doc.Load(fileName);

    string strGREYInner;

    foreach (HtmlNode td in doc.DocumentNode.SelectNodes("//tr[@class=\"tblDataGreyNH\"]"))
    {
        strGREYInner = td.InnerText.Trim();
        string shorted = strGREYInner.Replace("\t", ""); string shorted2 = shorted.Replace("\n\n\n\n", "\n\n\n"); string shorted3 = shorted2.Replace("\n\n\n", "\n\n"); string shorted4 = shorted3.Replace("\n\n", "\n");
        GREYsource = shorted4.Split(new Char[] { '\n', });
    }

    foreach (string str in GREYsource)
    {
        ...
    }
}
  • 问题:结果包含许多需要修剪的制表符(/t)和换行符(/n)
  • 问题:在我看来,这不是一个好方法。这只会抓住总时间
  • 可以做得更好

    这只是我尝试过的一个例子(其他代码只是一堆垃圾)

    我在下面附上了HTML结构:

    概览(图片):

    更深入一点:

    
    /*必须被忽略。没必要*/
    /*必须被忽略。没必要*/
    /*这包含了我需要的内容*/
    /*标题不是必需的*/
    /*内容从这里开始*/
    /*没必要*/
    /*没必要*/
    /*没必要*/
    /*在:*/
    在里面
    /*“tblDataWhiteNH”始终包含7“td nowrap”
    /*示例:如果它包含一个值*/
    7:53/*value=7:53(这个!)*/
    /*示例:如果它不包含值*/
    /*无值=0:00(此!)*/
    /*输出:*/
    出来
    /*“tblDataWhiteNH”始终包含7个“td nowrap”。
    /*示例:如果它包含一个值*/
    7:53/*value=7:53(这个!)*/
    /*示例:如果它不包含值*/
    /*无值=0:00(此!)*/
    /*在:*/
    /*输出:*/
    ...               /* “tblDataGreyNH”的构建方式与“tblDataWhiteNH”相同。
    ...               /* 有时可能会有更多的“tblDataWhiteNH”和“tblDataGreyNH”*/
    ...               /* 通常只有“tblDataWhiteNH”(输入/输出)*/
    /*没必要*/
    /*它继续f.egs。如果上面最后一个标题是“tblDatagrey”,则使用“tblDataWhite”*/
    /*反之亦然(“灰色”,如果之前有“白色”)*/
    /*工作:*/
    总时间
    07:47/*value=7:47(这个!)*/
    04:48       
    00:00/*无值=0:00(此!)*/
    00:00       
    07:42       
    00:00       
    00:00       
    /*总数:*/
    正常时间
    07:47/*value=7:47(这个!)*/
    04:48       
    /*无值=0:00(此!)*/
    07:42       
    /*没必要*/
    /*没必要*/
    
    原始HTML的副本:

    我希望有人能帮我把这件事做好


    好的,让我用图片解释一下
    在图片上你可以看到网站+下表,结果应该是什么样子

    声明数据表不是问题。
    主要的问题是,我不能让htmlagility吐出正确的结果,如果它吐出了正确的结果,它几乎是有缺陷的。 我尝试的一些selectnodes在一段时间后输出混乱。到目前为止,我还无法从网站上的表格中获取“所有”数据,只是一些值,但通常有问题。

    因此,我正在寻找一位能够了解这一点的人,或许可以帮助我找到正确的selectnodes。

    我不确定我是否完全理解您想要做什么,但这里有一个示例代码,可以帮助您开始。我强烈建议你看一看以了解它

            HtmlDocument doc = new HtmlDocument();
            doc.Load(yourFile);
    
            // get all TR with a specific class name, starting from root (/), and recursively (//)
            foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//tr[@class='tblDataGreyNH' or @class='tblDataWhiteNH']"))
            {
                // get all TD below the current node with a specific class name
                HtmlNode inOrOut = node.SelectSingleNode("td[@class='tblHeader']");
                if (inOrOut != null)
                {
                    string io = inOrOut.InnerText.Trim();
                    Console.WriteLine(io.ToUpper());
                    if (io.Contains("Time"))
                    {
                        // normalize-space gets rid or whitespaces (\r,\n, etc.)
                        // text() gets the node's inner text
                        foreach (HtmlNode td in node.SelectNodes("td[normalize-space(@class)='' and normalize-space(text())!='' and normalize-space(text())!='00:00']"))
                        {
                            Console.WriteLine("value:" + td.InnerText.Trim());
                        }
                    }
                }
    
                // gets all TD below the current node that define the NOWRAP attribute
                HtmlNodeCollection tdNoWraps = node.SelectNodes("td[@nowrap]"); 
                if (tdNoWraps != null)
                {
                    foreach (HtmlNode tdNoWrap in tdNoWraps)
                    {
                        string value = tdNoWrap.InnerText.Trim();
                        if (value == string.Empty)
                            continue;
    
                        Console.WriteLine("value:" + value);
                    }
                }
            }
    
    它将从您的示例页面中输出:

    IN
    value:7:47
    value:7:46
    value:7:45
    value:7:51
    OUT
    value:15:35
    value:15:33
    value:12:38
    value:8:59
    IN
    value:12:38
    value:8:59
    OUT
    value:15:35
    TOTAL TIME
    value:07:48
    value:07:47
    value:07:50
    value:01:08
    REGULAR TIME
    value:07:48
    value:07:47
    value:07:50
    value:01:08
    

    目前的问题很不清楚——你到底在问什么?你到底被困在哪里?你到底在找什么帮助?对不起,我解释得不清楚,我的英语不是很好,也不是c#的专家。我只想从我发布的html代码中得到一个c#格式的数据表。(datatable)行在c#中应该是这样的:
    table.rows.Add(“Daynumber,Timevalue,Status”)。我的问题是,我总是把所有的“td”搞得一团糟,没有得到有用的结果/数据表。我似乎被困在了html节点上,似乎还不清楚。我贴了一张照片,希望能解释得更好。哇,这正是我要找的。。非常感谢你!!顺便说一句,我不知道您可以在Xpath中使用'or/and'(现在我知道语法是什么了)来解析它。你的回答对我帮助很大。
    
    IN
    value:7:47
    value:7:46
    value:7:45
    value:7:51
    OUT
    value:15:35
    value:15:33
    value:12:38
    value:8:59
    IN
    value:12:38
    value:8:59
    OUT
    value:15:35
    TOTAL TIME
    value:07:48
    value:07:47
    value:07:50
    value:01:08
    REGULAR TIME
    value:07:48
    value:07:47
    value:07:50
    value:01:08