2017-11-20 28 views
0

에 표시된 테이블을 읽으 려합니다. 내가 HtmlAgilityPack와 함께 할 시도했을 때HtmlAgilityPack을 사용하여 C#에서 html 테이블을 구문 분석 할 수 없습니다.

, 난 당신이 나에게 문제가 무엇인지 알려 주시기 바랍니다 수 null

var nodes = document.DocumentNode.SelectNodes("//table[contains(@class, 'table')]"); 

는 무엇입니까? 내가 잘못하고있는거야?

+0

올바르게 작동합니다 (NuGet HtmlAgilityPack 1.6.5 사용) :'nodes'는 1 개의 테이블 요소를 포함합니다. HTML 코드를'document'에 올바르게로드 했습니까? 전체 소스 코드를 제공 할 수 있습니까? –

답변

0

사용이 방법 :

당신의 XPath는 아무 문제가 없습니다
document.DocumentNode.SelectNodes("//div[@class='col-sm-8']/table[contains(@class, 'table')]/tbody/tr") 
1

. 테이블에서 데이터를 가져 오는 방법을 모르는 것으로 가정합니다. xpaths를 찾아야합니다.

public static void Main(string[] args) 
    { 
     HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
     try 
     { 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.manualslib.com/brand/A.html"); 
      request.Method = "GET"; 
      request.ContentType = "text/html;charset=utf-8"; 

      using (var response = (HttpWebResponse)request.GetResponse()) 
      { 
       using (var stream = response.GetResponseStream()) 
       { 
        doc.Load(stream, Encoding.GetEncoding("utf-8")); 
       } 
      } 
     } 
     catch (WebException ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     //Works fine 
     HtmlNode tablebody = doc.DocumentNode.SelectSingleNode("//table[contains(@class, 'table')]/tbody"); 
     foreach(HtmlNode tr in tablebody.SelectNodes("./tr")) 
     { 
      Console.WriteLine("\nTableRow: "); 
      foreach(HtmlNode td in tr.SelectNodes("./td")) 
      { 
       if (td.GetAttributeValue("class", "null") == "col1") 
       { 
        Console.Write("\t " + td.InnerText); 
       } 
       else 
       { 
        HtmlNode temp = td.SelectSingleNode(".//div[@class='catel']/a"); 
        if (temp != null) 
        { 
         Console.Write("\t " + temp.GetAttributeValue("href", "no url")); 
        } 
       } 


      } 
     } 
     Console.ReadKey(); 
    } 

먼저 우리는 XPath의 노드, TBODY로 이동하지만, 경우에만 테이블에있는 클래스의 속성은 '테이블'이 포함되어

//table[contains(@class, 'table')]/tbody 

이제 우리는 그럴라고 모든 노드를 선택합니다 (테이블 행) :

도트

./tr 여기에 우리가 모든 TR-노드를 찾을 것 갈의 현재 상황에서 우리가 걸 의미한다. 그런 다음 각 TR-노드에서 우리는 함께 모든 TD-노드를 찾을려고하고있다 :

각 테이블 셀 지금

을 ./td 우리가 데이터를 얻을 싶어요. 첫 번째 td에서는 class-attribute가 'col1'과 동일하다는 것을 알 수 있습니다. 그래서 td가 그 값을 가진 클래스를 포함한다면 - 우리는 그 td-node 안에 텍스트를 가져 가고 싶습니다.

그러나 해당 특성이 포함되어 있지 않은 경우 'catel'값을 가진 class-attribute가있는 div 안에있는 앵커 태그를 원한다는 것을 알고 있습니다.

그 앵커 태그 안에 href 속성의 값을 원합니다.

0

Aspose.Html for .NET 라이브러리를 사용해 볼 수도 있습니다. 이 경우 , 당신은 아래 표와 같이 XPath를 사용하지 않고 테이블을 구문 분석 할 수 있습니다 :

class Program 
{ 
    private static void Main() 
    { 
     var document = new HTMLDocument("https://www.manualslib.com/brand/A.html"); 
     var tableRows = document.DocumentElement 
      .QuerySelectorAll("table.table tr") 
      .Cast<HTMLTableRowElement>(); 
     foreach (var row in tableRows) 
     { 
      var cells = row.Children.Cast<HTMLTableCellElement>().ToArray(); 
      var brand = cells[0].GetElementsByTagName("a")[0].InnerHTML; 
      var category = cells[1].GetElementsByTagName("a")[0].InnerHTML; 
      Console.WriteLine("{0,-30}{1}", brand,category); 
     } 
    } 
} 

PS를 : 나는 개발자 옹호로 Aspose와 함께 작동합니다.