1

我已经尝试了很长时间,但这是我的情况;

我朋友的 Web 应用程序使用非常简单的 HTML 运行一个网站来生成图表数据。我想从该页面上的表中获取某些值,因为他需要将此信息存储到数据库中。

所以这是 HTML 表格的一部分;

...
<tr>
    <td width=30 align=center bgcolor=#006699 class=W><font color=white>1</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>7387</td>

    <td width=30 height=25 align=center bgcolor=#006699 class=W><font color=white>2</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>2881</td>

    <td width=30 height=25 align=center bgcolor=#006699 class=W><font color=white>3</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>8782</td>

    <td width=30 height=25 align=center bgcolor=#006699 class=W><font color=white>4</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>5297</td>

    <td width=30 height=25 align=center bgcolor=#006699 class=W><font color=white>5</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>749</td>
</tr>
<tr>
    <td align=center bgcolor=#006699 class=W><font color=white>6</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>3136</td>

    <td height=25 align=center bgcolor=#006699 class=W><font color=white>7</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>8768</td>

    <td height=25 align=center bgcolor=#006699 class=W><font color=white>8</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>9548</td>

    <td height=25 align=center bgcolor=#006699 class=W><font color=white>9</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>6565</td>

    <td height=25 align=center bgcolor=#006699 class=W><font color=white>10</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>142</td>
</tr>
...

我想要实现的是;

  • 我得到两个数字 - 例如 1 和 8。
  • 我的应用程序检查页面的 HTML 并选择td包含数字的两个(如上所示)。
  • 然后,我必须得到 NEXT 的值td

这个的输出是1=7387and 8=9548td在尝试找到包含给定数字的两个后,我很快就卡住了。

到目前为止我的 C# 代码;

using (WebClient webClient = new WebClient())
{
    string completeHTMLCode = webClient.DownloadString("someUrl.php?getChartData=" + chartId);

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(completeHTMLCode);

    foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//td[@...]"))
    {

    }
 }

我在这里尝试一些不可能的事情吗?

4

3 回答 3

3

我制作了一个快速的 CsQuery 示例如何完成此操作。

string file = File.ReadAllText("a.html"); // gets the html

CQ dom = file; // initializes csquery
CQ td = dom["td"]; // get all td files

td.Each((i,e) => { // go through each
    if (e.FirstChild != null) // if element has child (font)
    {
        if (e.FirstChild.NodeType != NodeType.TEXT_NODE) // ignore text node
        {
            if (e.FirstChild.InnerText == "1") // if number is 1
            {
                Console.WriteLine(e.NextElementSibling.InnerText); // output the text
            }
            if (e.FirstChild.InnerText == "8") // etc etc
            {
                Console.WriteLine(e.NextElementSibling.InnerText);
            }
        }
    }

});

Console.ReadKey();
于 2013-03-23T01:16:33.537 回答
1

您可以将其解析为字典并以这种方式查找。我可以想出一些更好的方法来解析它,但这就是你想要的。

    void Main()
{
    string html = @"<tr>
    <td width=30 align=center bgcolor=#006699 class=W><font color=white>1</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>7387</td>

    <td width=30 height=25 align=center bgcolor=#006699 class=W><font color=white>2</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>2881</td>

    <td width=30 height=25 align=center bgcolor=#006699 class=W><font color=white>3</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>8782</td>

    <td width=30 height=25 align=center bgcolor=#006699 class=W><font color=white>4</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>5297</td>

    <td width=30 height=25 align=center bgcolor=#006699 class=W><font color=white>5</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>749</td>
</tr>
<tr>
    <td align=center bgcolor=#006699 class=W><font color=white>6</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>3136</td>

    <td height=25 align=center bgcolor=#006699 class=W><font color=white>7</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>8768</td>

    <td height=25 align=center bgcolor=#006699 class=W><font color=white>8</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>9548</td>

    <td height=25 align=center bgcolor=#006699 class=W><font color=white>9</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>6565</td>

    <td height=25 align=center bgcolor=#006699 class=W><font color=white>10</font></td>
    <td width=50 bgcolor=#FFFFFF align=center>142</td>
</tr>";

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);

    int[] nodes = doc.DocumentNode.SelectNodes("//td").Select ( dn =>
        int.Parse(dn.InnerHtml.Contains("font") ? dn.FirstChild.InnerHtml : dn.InnerHtml)
        ).ToArray();

    Dictionary<int,int> d = new Dictionary<int,int>();
    for (int i = 0; i < nodes.Length; i+=2)
        d.Add(nodes[i],nodes[i+1]);

    d.Dump();
    d[1].Dump();
    d[8].Dump();
}
于 2013-03-23T01:15:16.903 回答
0

好吧,如果你只有这个表数据可以使用它可以使用 HTMLAgilityPack 解析。

我要做的第一件事是取消 foreach 来遍历 tds,我会使用计数器,然后使用计数器 id 作为索引器。代码可能看起来像这样

for(int i = 1;i <= selectednodes.Count();i++)
{
  if(selectednodes[i-1].InnerHtml.Contains("font")
  {
   if(selectednodes[i-1].FirstChild.Value == "1" || selectednodes[i-1].FirstChild.Value == "8")
   {
      myNodecollection.Add(selectednodes[i])
   }
  }
}
于 2013-03-23T01:29:21.973 回答