2014-01-19 5 views
1

html에서 특정 데이터를 가져오고 싶습니다.html에서 특정 데이터 얻기

StringBuilder pureText = new StringBuilder(); 
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(Lyrics); 

var s = doc.DocumentNode.Descendants("p"); 

try 
{ 
    foreach (HtmlNode childNode in s) 
    { 
         pureText.Append(childNode.InnerText); 
    } 
} 
catch 
{ } 

UPDATE :

StringBuilder pureText = new StringBuilder(); 
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(URL); 

var s = doc.DocumentNode.SelectNodes("//p[@class='verse']"); // error 

try 
{ 
    foreach (HtmlNode childNode in s) 
    { 
      pureText.Append(childNode.InnerText); 
    } 
} 
catch 
{ } 

ERROR :

'C#에서

여기
<p class="heading"><span>Greeting!</span> 

<p class='verse'>Hi!<br>    // 
Hello!</p><p class='verse'>Hello!<br> // i want to get this g 
Hi!</p>        // 

<p class="writers"><strong>WE</strong><br/> 

내 코드 : 임 사용하여 C# 및 HtmlAgilityPack

다음은 HTML 샘플입니다 HtmlAgili tyPack.HtmlNode '에는'SelectNodes '에 대한 정의가없고'HtmlAgilityPack.HtmlNode '유형의 첫 번째 인수를 허용하는'SelectNodes '확장 메서드가 없습니다 (지시문이나 어셈블리 참조가 누락 되었습니까?)

답변

4

당신은 모든 <p>이 같은 class='verse'을 갖는 선택하는 XPath 쿼리 구문을 시도 할 수 있습니다 : 당신이 이미 가지고있는

var s = doc.DocumentNode.SelectNodes("//p[@class='verse']"); 

그런 다음 같은 foreach을한다.

업데이트 I :

내가 모르는 이유에 대한 오류를 던져 위의 코드. 그것은 내 PC에서 테스트를 잘 수행해야합니다. 당신이 해결 방법을 받아 들일 어쨌든 경우, 동일한 쿼리는 XPath를하지 않고이 방법으로 달성 할 수있다 : 우리는 노드가 속성 '값을 확인하기 전에, 클래스 attibutes을 가지고 아닌지 확인해야하기 때문에

var s = doc.DocumentNode.Descendants("p").Where(o => o.Attributes["class"] != null && o.Attributes["class"].Value == "verse"); 

이 솔루션은 더 길다. 그렇지 않은 경우 <p>에 클래스 속성이없는 경우 Null Reference Exception이 표시됩니다.

+2

은 'HtmlAgilityPack.HtmlNode'에 'SelectNodes'에 대한 정의가없고 'HtmlAgilityPack.HtmlNode'유형의 첫 번째 인수를 허용하는 확장 메소드 'SelectNodes'가 없습니다 (사용 지시문 또는 어셈블리 참조?) – user3190447

+0

'SelectNodes'의 인수는'HtmlNode'가 아니라 내 대답에서 볼 수있는 문자열이어야합니다. 이 솔루션을 어떻게 적용 했습니까? 수정 방법을 찾을 수없는 경우 오류를 트리거하는 코드를 게시하십시오. – har07

+0

StringBuilder pureText = new StringBuilder(); HtmlDocument doc = 새 HtmlDocument(); doc.LoadHtml (URL); var s = doc.DocumentNode.SelectNodes ("// p [@ class = 'verse']"); // 오류 { foreach는 (들에 HtmlNode childNode에) { pureText.Append (childNode.InnerText)을 시도; } } catch {} – user3190447