2010-11-23 8 views
0

をディレクトリ一覧を取得するコマンドのHttpWebRequest 。リンクに引用されているサンプルサーバーのファイルを一覧表示できますが、サーバーに最後に追加されたファイルが表示されます。私のコードは、そこの例とまったく同じです。 私のHTMLコードが少し違うことに気付きました。誰かがアイデアを持っている:は、私ははwebServerディレクトリからの私のHttpRequestとリストファイルを作成する例を、次に、以下の記事では

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>186.215.156.154 - /download/Zatix/Zatix - Satisfação Geral/</title> 
</head> 
<body> 
    <h1> 
     186.215.156.154 - /download/Zatix/Zatix - Satisfação Geral/</h1> 
    <hr> 
    <pre> 
    <a href="/download/Zatix/">[Para a pasta superior]</a> 
    <br> 
    <br> 
    sexta-feira, 19 de novembro de 2010 11:17  52355 <a href="/download/Zatix/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral_3_00.zip">Zatix - Satisfação Geral_3_00.zip</a><br>sexta-feira, 19 de novembro de 2010 11:17  52355 <a href="/download/Zatix/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral_4_00.zip">Zatix - Satisfação Geral_4_00.zip</a> 
    <br> 
</pre> 
    <hr> 
</body> 
</html 

私はGetDirectoryListingRegexForUrlメソッドの戻り値で何かを変更することがあると思います。私はあなたが私を助けることができると思います

private string GetDirectoryListingRegexForUrl(string url) 
{ 
    if (url.Equals(Url)); 
    { 
     return "<A HREF=\".*\">(?<name>.*)</A>";     
    } 
    throw new NotSupportedException(); 
} 

public void ListStudies() 
{ 
    Url = BaseUrl + this.clientName + "/" + this.activeStudy + "/"; 
    Console.WriteLine(Url); 
    CookieContainer cookies; 
    HttpWebResponse response; 
    HttpWebRequest req = (HttpWebRequest)System.Net.WebRequest.Create(Url);    

    req.Credentials = _NetworkCredential; 
    req.CookieContainer = new CookieContainer(); 
    req.AllowAutoRedirect = true; 
    cookies = req.CookieContainer; 

    try 
    { 
     response = (HttpWebResponse)req.GetResponse(); 

     if (response.StatusCode != HttpStatusCode.OK) 
      Console.WriteLine("URL NÃO RESPONDEU"); 
     else 
      Console.WriteLine("URL OK"); 

     using (response) 
     { 
      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       string html = reader.ReadToEnd(); 
       Regex regex = new Regex(GetDirectoryListingRegexForUrl(Url)); 
       MatchCollection matches = regex.Matches(html);            

       if (matches.Count > 0) 
       { 
        foreach (Match match in matches) 
        { 
         if (match.Success) 
         { 
          Console.WriteLine(match.Groups["name"]);          
         }         
        } 
       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show(e.Message, "Update Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    }    
} 

私のコードは次のようなものです!ありがとう。

答えて

1

2つの大きな問題があります。

1)。このようなリクエストの出力は完全に任意であり、保証されていません。それはサーバーの関心事です。

2)。 Regexは、通常の文法ではないため、HTMLやそれに類する構造を解析するためにnot a suitable meansです。あなたの応答に何らかの信頼性があると仮定した場合の最善の策は、HtmlAgilityPackのようなものに依存して厳しいXHTML文書を実行することです(あなたが運が良ければ必要ないかもしれません)。そしてXPathクエリあなたが興味のあるコンテンツを引き出すために

1

をここで正しい正規表現があります:。

<A HREF=\".*?\">(?<name>.*?)</A> 

を元に、それを比較します

<A HREF=\".*\">(?<name>.*)</A> 

問題は、繰り返し演算子であるデフォルトでは欲張りです。グリーディは、マッチを探している間、正規表現が可能な限り拡大することを意味します。それは最初の<Aで始まり、最後のA>で終わることを意味します。その中のすべての文字列にはすべてが入ります。その「すべて」には他のものが含まれています<A...A>が中間にあります。

繰り返し演算子を遅延させるように指定する必要があります。 .*?のように?を追加してください。

P.S.正規表現でHTMLを解析することは悪い考えであることはよく知られています。クイックで汚れた修正が必要だが、長期的な解決策がない場合は大丈夫です。あなたのケースでは、出力はサーバーごと、サーバーごとの可能性が高いという事実を加えてください。コードは普遍的な機能ではありません。ディレクトリリストを取得するためにサーバーと直接交渉するような他のアプローチを検討してください(もちろんアクセス権がある場合)。

そしてTHEMAに最終的にいくつかの面白い読み取り:

Parsing Html The Cthulhu Way

RegEx match open tags except XHTML self-contained tags

+0

どうもありがとう、私は、以前の正規表現を使用して多くの時間を無駄にし、それは常に1試合を返されました。更新された正規表現があなたから与えられ、素晴らしい動作します。 –

関連する問題