문제

나는 하나의 웹 페이지에 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.After 그 테이블을 찾은 후 칼럼 주소와 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;
       }
   }
}

인기 답변

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++;
}

웹 페이지를 수정할 수 있다면 헤더 텍스트에는 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에서 매우 유용합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.