HTML 테이블에서 데이터 테이블로 데이터 가져 오기

c# html html-agility-pack linq xpath

문제

그래, 라이브 웹 사이트를 쿼리하여 테이블에서 데이터를 가져와이 HTML 테이블을 DataTable에 넣은 다음이 데이터를 사용해야합니다. 지금까지 HTML 애자일 팩과 XPath를 사용하여 필요한 테이블의 각 행을 가져 왔지만 DataTable로 파싱하는 방법이 있어야합니다. (C #) 현재 사용중인 코드는 다음과 같습니다.

string htmlCode = "";
using (WebClient client = new WebClient())
{
htmlCode = client.DownloadString("http://www.website.com");
}
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

doc.LoadHtml(htmlCode);

//My attempt at LINQ to solve the issue (not sure where to go from here)
var myTable = doc.DocumentNode
.Descendants("table")
.Where(t =>t.Attributes["summary"].Value == "Table One")
.FirstOrDefault();

//Finds all the odd rows (which are the ones I actually need but would prefer a
//DataTable containing all the rows!
foreach (HtmlNode cell in doc.DocumentNode.SelectNodes("//tr[@class='odd']/td"))
{
string test = cell.InnerText;
//Have not gone further than this yet!
}

쿼리하는 웹 사이트의 HTML 테이블은 다음과 같습니다.

string htmlCode = "";
using (WebClient client = new WebClient())
{
htmlCode = client.DownloadString("http://www.website.com");
}
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

doc.LoadHtml(htmlCode);

//My attempt at LINQ to solve the issue (not sure where to go from here)
var myTable = doc.DocumentNode
.Descendants("table")
.Where(t =>t.Attributes["summary"].Value == "Table One")
.FirstOrDefault();

//Finds all the odd rows (which are the ones I actually need but would prefer a
//DataTable containing all the rows!
foreach (HtmlNode cell in doc.DocumentNode.SelectNodes("//tr[@class='odd']/td"))
{
string test = cell.InnerText;
//Have not gone further than this yet!
}

원하는 결과를 얻으려면 LINQ + HAP 또는 XPath + HAP을 사용하는 것이 더 좋고 / 더 쉬운 지 확실하지 않습니다. 아마도 두 가지를 모두 시도해 보았을 것입니다. 이것은 내가 웹 사이트를 질의하거나 어떤 식 으로든 웹 사이트와 상호 작용할 수있는 프로그램을 만든 적이 처음이므로이 순간에 매우 확신 할 수 없습니다! 미리 도움 주셔서 감사합니다 :)

수락 된 답변

HTML 애자일 팩과 같은 방법은 없지만 HTML 애자 팩을 만드는 것은 어렵지 않습니다. Linq-XML에서 Datatable에 XML을 수행하는 샘플 이 있습니다. 이것들은 당신이 필요로하는 것으로 재 작업 될 수 있습니다.

필요한 경우 전체 방법을 만드는 데 도움을 줄 수 있지만 오늘은 아닙니다.

참조 :


인기 답변

위의 Jack Eker의 코드 중 일부와 Mark Gravell의 코드 ( 여기 게시 참조 )를 사용하여 솔루션을 제공 할 수있었습니다. 이 코드 스 니펫은이 기사를 작성할 때 남아프리카에서 2012 년 공휴일을 얻는 데 사용됩니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Web;
using System.Net;
using HtmlAgilityPack;



namespace WindowsFormsApplication
{
    public partial class Form1 : Form
    {
        private DataTable dt;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            string htmlCode = "";
            using (WebClient client = new WebClient())
            {
                client.Headers.Add(HttpRequestHeader.UserAgent, "AvoidError");
                htmlCode = client.DownloadString("http://www.info.gov.za/aboutsa/holidays.htm");
            }
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

            doc.LoadHtml(htmlCode);

            dt = new DataTable();
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Value", typeof(string));

            int count = 0;


            foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table"))
            {

                foreach (HtmlNode row in table.SelectNodes("tr"))
                {

                    if (table.Id == "table2")
                    {
                        DataRow dr = dt.NewRow();

                        foreach (var cell in row.SelectNodes("td"))
                        {
                            if ((count % 2 == 0))
                            {
                                dr["Name"] = cell.InnerText.Replace(" ", " ");
                            }
                            else
                            {

                                dr["Value"] = cell.InnerText.Replace(" ", " ");

                                dt.Rows.Add(dr);
                            }
                            count++;

                        }


                    }

                }


                dataGridView1.DataSource = dt;

            }
        }

    }
}



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