C# 抓取时间表HTMLAgilityPack
我需要从网站上拿一张时间表。我想将此时间表存储/添加到我的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获取所有数据。一个例子: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 .. ..
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)
{
...
}
}
/*必须被忽略。没必要*/
/*必须被忽略。没必要*/
/*这包含了我需要的内容*/
/*标题不是必需的*/
/*内容从这里开始*/
/*没必要*/
/*没必要*/
/*没必要*/
/*在:*/
在里面
/*“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