9

テーブルを含む html ページがあり、そのテーブルを C# Windows フォームで解析したい

http://www.mufap.com.pk/payout-report.php?tab=01

これは私が試した解析したいウェブページです

> Foreach(Htmlnode a in document.getelementbyname("tr"))
{
    richtextbox1.text=a.innertext;
}

私はこのようなことを試しましたが、すべてのtrを単に印刷しているだけなので、表形式で表示されません。英語で申し訳ありませんが、これについて助けてください。

4

3 に答える 3

51

Htmlアジリティ パックの使用

WebClient webClient = new WebClient();
string page = webClient.DownloadString("http://www.mufap.com.pk/payout-report.php?tab=01");

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(page);

List<List<string>> table = doc.DocumentNode.SelectSingleNode("//table[@class='mydata']")
            .Descendants("tr")
            .Skip(1)
            .Where(tr=>tr.Elements("td").Count()>1)
            .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
            .ToList();
于 2012-10-22T06:13:52.147 に答える
15

このようなことですか?

foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) {
    ///This is the table.    
    foreach (HtmlNode row in table.SelectNodes("tr")) {
    ///This is the row.
        foreach (HtmlNode cell in row.SelectNodes("th|td")) {
            ///This the cell.
        }
    }
}
于 2012-10-22T04:59:15.783 に答える
2

これは遅れていますが、プレーンなバニラ C# コードを使用して要求したことを行う方法は次のとおりです。

/// <summary>
/// parses a table and returns a list containing all the data with columns separated by tabs
/// e.g.: records = getTable(doc, 0);
/// </summary>
/// <param name="doc">HtmlDocument to work with</param>
/// <param name="number">table index (base 0)</param>
/// <returns>list containing the table data</returns>
public List<string> getTableData(HtmlDocument doc, int number)
{
  HtmlElementCollection tables = doc.GetElementsByTagName("table");
  int idx=0;
  List<string> data = new List<string>();

  foreach (HtmlElement tbl in tables)
  {
    if (idx++ == number)
    {
      data = getTableData(tbl);
      break;
    }
  }
  return data;
}

/// <summary>
/// parses a table and returns a list containing all the data with columns separated by tabs
/// e.g.: records = getTable(getElement(doc, "table", "id", "table1"));
/// </summary>
/// <param name="tbl">HtmlElement table to work with</param>
/// <returns>list containing the table data</returns>
public List<string> getTableData(HtmlElement tbl)
{
  int nrec = 0;
  List<string> data = new List<string>();
  string rowBuff;

  HtmlElementCollection rows = tbl.GetElementsByTagName("tr");
  HtmlElementCollection cols;
  foreach (HtmlElement tr in rows)
  {
    cols = tr.GetElementsByTagName("td");
    nrec++;
    rowBuff = nrec.ToString();
    foreach (HtmlElement td in cols)
    {
      rowBuff += "\t" + WebUtility.HtmlDecode(td.InnerText);
    }
    data.Add(rowBuff);
  }

  return data;
}

上記では、ページ内のテーブル「インデックス」を使用するか (名前のないテーブルに役立ちます)、または「テーブル」HtmlElement を関数に渡すことによって (より高速ですが、名前付きテーブルにのみ役立ちます)、テーブルからデータを抽出できます。結果として「リスト」を返すことを選択し、タブ文字を使用してさまざまな列データを分離していることに注意してください。コードを簡単に変更して、好みの他の形式でデータを返すことができます

于 2016-03-29T10:23:55.810 に答える