2012-06-08 4 views
0

웹 페이지에서 모든 mp3를 다운로드하는 앱을 만들려고하지만 소스에서 다운로드하지 않습니다. http://ytcracker.com/music/에서 다운로드 중이며 나열된 각 노래에 대해 URL 끝에 복사하여 붙여 넣으면 해당 노래에 대한 링크가 표시됩니다. 내가 파일을 다운로드하는 웹 클라이언트를 사용하고, 나는 웹 페이지가 아닌 HTML에서의 readline 수 있다면 여기에 내 코드입니다, 그럼 난 그냥 client.DownloadFile(url + line, path)을 수행 할 수 있습니다HTML이 아닌 웹 페이지에서 텍스트 읽기

var url = "http://ytcracker.com/music/"; 
var sr = new StreamReader(WebRequest.Create(url).GetResponse().GetResponseStream()); 
string line; 
while ((line = sr.ReadLine()) != null) 
{ 
    MessageBox.Show("http://www.ytcracker.com/music/" + line); 
    using (var client = new WebClient()) 
    { 
     client.DownloadFile("http://www.ytcracker.com/music/" + line, @"C:\Users\Lavi\Downloads\downloadto\.mp3"); 
    } 
} 

문제가 '선'것은의 소스를 가져옵니다 페이지가 아닌 텍스트. 페이지 텍스트를 얻을 수있는 방법이 있다면 저를 도와주세요. 감사!

EDIT : 경로가있는 곳에서도 파일 이름 대신 .mp3이 나와서 .mp3이 표시됩니다. 나는 for 루프를 만들고 페이지가 모두 읽힐 때까지 루프 할 때마다 목록에 추가 한 다음 .mp3에 추가합니다. 그래서 그것은 'i.mp3'과 같을 것이고 그래서 mp3s는 1.mp3, 2.mp3, 3.mp3 등과 같은 폴더에있을 것입니다.

+0

제목 앞에 "C#"을 붙일 필요는 없습니다. \t "[스택 오버플로는 SEO 기술이 필요하지 않습니다.] (http://meta.stackexchange.com/a/130208)"를 참조하십시오. –

답변

2

가장 간단한 방법은 텍스트를 HTML 소스 (HTML을 파싱하지 않고 얻을 수있는 모든 것)는 HTML Agility Pack입니다.

소프트웨어 외에 사이트에서 직접적인 튜토리얼이 있습니다.

당신은 정규 표현식을 사용할 수 있습니다 HTML 민첩성 팩 구체적으로

HTMLAgilityPack iterate all text nodes only

0

를 텍스트를 잡아 당겨에 대한 지침은 아래의 질문을 참조하십시오. 이 밖으로 시도, 그것은 코드의 - 난 그냥 정규식을 추가

var url = "http://ytcracker.com/music/"; 
var sr = new StreamReader(WebRequest.Create(url).GetResponse().GetResponseStream()); 
string line; 

var re = new Regex(@"<li><a href=.*mp3.>(.*)</a></li>"); 

while ((line = sr.ReadLine()) != null) 
{ 
    using (var client = new WebClient()) 
    { 
     if (re.IsMatch(line)) 
     { 
      var match = re.Match(line); 

      client.DownloadFile("http://www.ytcracker.com/music/" + match.Groups[1], @"C:\Users\Lavi\Downloads\downloadto\.mp3"); 
     } 
    } 
} 
+0

인기있는 믿음과는 달리 정규 표현식이 항상 최상의 해결책은 아닙니다 :-) 그가 근근이 살아가는 페이지가 크게 변경되면 어떻게 될까요? 정규 표현식을 변경하는 것보다 본격적인 HTML 구문 분석기를 사용하여 코드를 수정하는 것이 훨씬 쉽습니다. –

+0

동의합니다. 정규식은 최고의 솔루션이 아닌 솔루션입니다. –

2

를 귀하의 경우에는 음악을 다운로드, 당신은 HREF 값을 읽고 그들이 경로를 구성하기 전에 .mp3 파일 있는지 확인해야합니다. Eric J이 언급 한 것처럼 HtmlAgilityPack은 사용하기가 더 쉽습니다. 다운로드하여 프로젝트에 dll 참조를 추가 한 다음이 코드를 사용하십시오.

 var url = "http://ytcracker.com/music/"; 
     var sr = new StreamReader(WebRequest.Create(url).GetResponse().GetResponseStream()); 
     HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
     htmlDoc.LoadHtml(sr.ReadToEnd()); 
     foreach (HtmlNode link in htmlDoc.DocumentNode.SelectNodes("//a[@href]")) 
     { 
      HtmlAttribute att = link.Attributes["href"]; 
      if (att.Value.EndsWith(".mp3")) 
      { 
       MessageBox.Show("http://www.ytcracker.com/music/" + att.Value); 
       using (var client = new WebClient()) 
       { 
        client.DownloadFile("http://www.ytcracker.com/music/" + att.Value, @"C:\Users\Lavi\Downloads\downloadto\.mp3"); 
       } 
      } 
     } 
관련 문제