2012-05-09 5 views
5

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

웹 사이트의 HTML 테이블 내가 쿼리하고 외모 :

<table summary="Table One"> 
<tbody> 
<tr class="odd"> 
<td>Some Text</td> 
<td>Some Value</td> 
</tr> 
<tr class="even"> 
<td>Some Text1</td> 
<td>Some Value1</td> 
</tr> 
<tr class="odd"> 
<td>Some Text2</td> 
<td>Some Value2</td> 
</tr> 
<tr class="even"> 
<td>Some Text3</td> 
<td>Some Value3</td> 
</tr> 
<tr class="odd"> 
<td>Some Text4</td> 
<td>Some Value4</td> 
</tr> 
</tbody> 
</table> 

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

+0

이 정보가 도움이 되나요? http://weblogs.asp.net/grantbarrington/archive/2009/10/15/screen-scraping-in-c.aspx – iwayneo

답변

4

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

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

은 참조 :

+0

이 리소스를 살펴본 후 감사 드리며 내가 관리 할 수있는 몇 가지 사례를 제공해 주셔서 감사합니다. 그것을 할 수있는 방법 : D –

+0

다른 사람들을 위해서 당신의 솔루션을 기꺼이 나눌 의향이 있습니까? – jessehouwing

+0

아래 팁 추가 솔루션을 제공해 주셔서 감사합니다! –

3

이 내 솔루션입니다. 조금 지저분하지만이 순간에 완벽하게 작동 할 수 있습니다 : D

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

doc.LoadHtml(htmlCode); 

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

int count = 0; 
decimal rowValue = 0; 
bool isDecimal = false; 
foreach (var row in doc.DocumentNode.SelectNodes("//table[@summary='Table Name']/tbody/tr")) 
{ 
DataRow dr = dt.NewRow(); 
foreach (var cell in row.SelectNodes("td")) 
{ 
if ((count % 2 == 0)) 
{ 
dr["Name"] = cell.InnerText.Replace("&nbsp;", " "); 
} 
else 
{ 
isDecimal = decimal.TryParse((cell.InnerText.Replace(".", "")).Replace(",", "."), out rowValue); 
if (isDecimal) 
{ 
dr["Value"] = rowValue; 
} 
dt.Rows.Add(dr); 
} 
count++; 
} 
} 
8

잭 에겔의 위의 코드와 마크 Gravell에서 일부 코드 (see post here)의 일부를 사용하여, 나는 해결책으로 올 수 있었다. 이 코드는 데이터 테이블에 htmltable 변환이 문서를

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("&nbsp;", " "); 
          } 
          else 
          { 

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

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

         } 


        } 

       } 


       dataGridView1.DataSource = dt; 

      } 
     } 

    } 
} 
1

간단한 논리를 작성로 남아프리카 공화국에서 2012 년의 공휴일을 얻기 위해 사용됩니다

//Define your webtable 
public static HtmlTable table 
      { 
       get 
       { 
        HtmlTable var = new HtmlTable(parent); 
        var.SearchProperties.Add("id", "searchId"); 
        return var; 
       } 
      } 

//Convert a webtable to datatable 
public static DataTable getTable 
      { 
       get 
       { 
        DataTable dtTable= new DataTable("TableName"); 
        UITestControlCollection rows = table.Rows; 
        UITestControlCollection headers = rows[0].GetChildren(); 
        foreach (HtmlHeaderCell header in headers) 
        { 
         if (header.InnerText != null) 
          dtTable.Columns.Add(header.InnerText); 
        } 
        for (int i = 1; i < rows.Count; i++) 
        { 
         UITestControlCollection cells = rows[i].GetChildren(); 
         string[] data = new string[cells.Count]; 
         int counter = 0; 
         foreach (HtmlCell cell in cells) 
         { 
          if (cell.InnerText != null) 
           data[counter] = cell.InnerText; 
          counter++; 
         } 
         dtTable.Rows.Add(data); 
        } 
        return dtTable; 
       } 
      } 
0

당신은 시도 할 수 있습니다

DataTable.Rows[i].Cells[j].InnerText; 

여기서 DataTable은 테이블의 ID입니다. i는 행이고 j는 셀입니다.

관련 문제