1

私はかなり長い間試みてきましたが、これは私の場合です。

私の友人のWebアプリケーションは、非常に単純なHTMLを使用してWebサイトを実行し、グラフのデータを生成します。彼はこの情報をデータベースに保存する必要があるため、そのページのテーブルから特定の値を取得したいと思います。

したがって、これは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の2つの数字を取得します。
  • 私のアプリケーションはページのHTMLをチェックしtd、数字を含む2つ(上記のように)を選択します。
  • 次に、NEXTの値を取得する必要がありますtd

これの出力はとに1=7387なり8=9548ます。td与えられた番号を含む2つを見つけようとした後、私はかなり速く行き詰まりました。

これまでの私の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 に答える