HTML敏捷性パック
-
19-09-2019 - |
質問
私は
のようなものWebページでHTMLテーブルを持っています<table border=1>
<tr><td>sno</td><td>sname</td></tr>
<tr><td>111</td><td>abcde</td></tr>
<tr><td>213</td><td>ejkll</td></tr>
</table>
<table border=1>
<tr><td>adress</td><td>phoneno</td><td>note</td></tr>
<tr><td>asdlkj</td><td>121510</td><td>none</td></tr>
<tr><td>asdlkj</td><td>214545</td><td>none</td></tr>
</table>
これでHTMLの敏捷性パックを使用して、このWebページから、私はノーのみカラムアドレスと電話のデータを抽出したいです。これは、そのために私は私が何をすべきその列アドレスとPHONENOのデータを抽出したい、そのテーブルを見つけるカラムアドレスとphoneno.Afterがあるどのテーブルに最初の発見持っていることを意味?
私はテーブルを取得することができます。しかし、その後、私は何をすべき理解していない。
そして他の事:私たちは列名によってテーブルからデータを抽出できることが可能である。
解決
ここでは、あなたがインスタンスをDataTable
するHTMLテーブルを解析するのに役立ついくつかのヘルパーメソッドです。あなたはちょうどあなたがしたい列を含むものを見つけるために、結果としてDataTable
の配列を反復処理することができます。コードはHTMLのテーブルの形式で結合され、この場合には、最初の行(<tr>
)から列情報を取得します。また、エラーチェックが実行されないことに注意してください、これはあなたが指定した形式に従わないだろうテーブルが壊れます。
ヘルパーメソッド:
private static DataTable[] ParseAllTables(HtmlDocument doc)
{
var result = new List<DataTable>();
foreach (var table in doc.DocumentNode.Descendants("table"))
{
result.Add(ParseTable(table));
}
return result.ToArray();
}
private static DataTable ParseTable(HtmlNode table)
{
var result = new DataTable();
var rows = table.Descendants("tr");
var header = rows.Take(1).First();
foreach (var column in header.Descendants("td"))
{
result.Columns.Add(new DataColumn(column.InnerText, typeof(string)));
}
foreach (var row in rows.Skip(1))
{
var data = new List<string>();
foreach (var column in row.Descendants("td"))
{
data.Add(column.InnerText);
}
result.Rows.Add(data.ToArray());
}
return result;
}
使用例:
public static void Main(string[] args)
{
string html = @"
<html><head></head>
<body><div>
<table border=1>
<tr><td>sno</td><td>sname</td></tr>
<tr><td>111</td><td>abcde</td></tr>
<tr><td>213</td><td>ejkll</td></tr>
</table>
<table border=1>
<tr><td>adress</td><td>phoneno</td><td>note</td></tr>
<tr><td>asdlkj</td><td>121510</td><td>none</td></tr>
<tr><td>asdlkj</td><td>214545</td><td>none</td></tr>
</table>
</div></body>
</html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
DataTable addressAndPhones;
foreach (var table in ParseAllTables(doc))
{
if (table.Columns.Contains("phoneno") && table.Columns.Contains("adress"))
{
// You found the address and phone number table
addressAndPhones = table;
}
}
}
他のヒント
tablerowsをループやインデックスで列の値を取得します。
int index = 0;
foreach(HtmlNode tablerow in table.SelectNodes("tr"))
{
// skip the first row...
if(index > 0)
{
// select first td element
HtmlNode td1 = tablerow.SelectSingleNode("td[1]");
if(td1 != null)
{
string address = td1.InnerText;
}
}
index++;
}
あなたがWebページを変更することができた場合は、、あなたは、ヘッダーテキストと実際の値についてのtbodyのためのthead要素を使用することができます。
<table id="mytable">
<thead><tr><td>Column1</td><td>Column2</td></tr></thead>
<tbody>
<tr><td>Value 1</td><td>Value 2</td></tr>
<tr><td>Value 1</td><td>Value 2</td></tr>
</tbody>
</table>
そして、あなたが最初の行をスキップする必要はありません。
foreach(HtmlNode tablerow in table.SelectNodes("/table[@id=\"mytable\"]/tbody/tr"))
{
// ...
}
いくつかのXPathのチュートリアルを見てください、それはHtmlAgilityPackと非常に便利です。
所属していません StackOverflow