HTML 민첩성 팩
-
19-09-2019 - |
문제
하나의 웹 페이지와 같은 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 민첩성 팩을 사용하는이 웹 페이지에서 열 주소와 전화의 데이터 만 추출하고 싶습니다. 그것은 열 주소와 phoneno가있는 테이블에서 먼저 발견된다는 것을 의미합니다. 그 테이블을 찾은 후에는 그 열 주소의 데이터를 추출하고 phoneno는 어떻게해야합니까?
테이블을 얻을 수 있습니다. 그러나 그 후에 나는 무엇을 이해하지 못해야합니다.
그리고 다른 것 : 열 이름을 통해 표에서 데이터를 추출 할 수 있습니다.
해결책
다음은 HTML 테이블을 구문 분석하는 데 도움이되는 몇 가지 도우미 방법입니다. DataTable
인스턴스. 결과를 통해 반복 할 수 있습니다 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;
}
}
}
다른 팁
타블러로 루프하고 색인 별 열 값을 얻습니다
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++;
}
웹 페이지를 수정할 수 있다면 헤더 텍스트에 thead를 사용할 수 있고 실제 값에는 tbody를 사용할 수 있습니다.
<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