2011-06-06 6 views
1

まず、アンカーされたタグをすべて解析し、hrefタグを解析してから、独立したリンクではないすべてのタグを削除するために正規表現を実行して、httpリンク用のWebページを解析しています= "/ img/link.php")。次のコードは正しく動作しますが、解析されたリンクの間に多くの空白行が追加されます。この問題を解決するにはリンクの解析と余分なブランクの受信

while (parse.ParseNext("a", out tag)) 
{ 
    string value; 
    //A REGEX value, this one finds proper http address' 
    Regex regexObj = new Regex(@"^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$"); 
    if (tag.Attributes.TryGetValue("href", out value)) 
    { 
     string value2; 
     //Start finding matches... 
     Match matchResults = regexObj.Match(value); 
     value2 = matchResults.Value; 
      lstPages.AppendText(value2 + "\r\n");       
    } 
} 

は、私は次のコードを追加し、それがリストをクリーンアップするために動作します:

if (value2 != "") 
{ 
    lstPages.AppendText(value2 + "\r\n"); 
} 

しかし、私

  1. は、これが最も効率的であると信じてはいけませんこれについて行く方法と
  2. まだ!= ""行がどこから来たのかわかりません。

私の実際の質問は、これらの結果を受け取る理由を知りたいと思っています。

答えて

2

あなたはvalue2に空の文字列を取得している理由は、matchResults.Value == ""場合正規表現が一致しません。 value2 != ""かどうかを確認する代わりに、matchResults.Successを直接チェックして、正規表現が一致するかどうかを確認することができます。とにかく、あなたの特定の正規表現が空の文字列と決して一致しないので、基本的にはそれをやっていますが、matchResults.Successをチェックする方が簡単です。

また、ループの繰り返しごとにRegexオブジェクトを作成する必要はありません。ここに私が提案した変更があります:

//A REGEX value, this one finds proper http address' 
Regex regexObj = new Regex(@"^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$"); 
while (parse.ParseNext("a", out tag)) 
{ 
    string value; 

    if (tag.Attributes.TryGetValue("href", out value)) 
    { 
     string value2; 
     //Start finding matches... 
     Match matchResult = regexObj.Match(value); 
     if (matchResult.Success) 
     { 
      value2 = matchResult.Value; 
      lstPages.AppendText(value2 + "\r\n"); 
     } 
    } 
} 
-1

TryGetValueは、一般的な方法(Type T)です。それは返すように任意の値を持っているdoesntの場合、それは

+0

この回答は 'matchResults.Value ==" "'時間の一部を説明していません。 -1 –

2

使用Html Agility Pack文字列のためのString.Emptyまたは""である、default value of the typeをreturnd代わり

static void Main(string[] args) 
{ 
    var html = new HtmlDocument(); 
    var request = WebRequest.Create("http://stackoverflow.com/questions/6256982/parsing-links-and-recieving-extra-blanks/6257328#6257328") as HttpWebRequest; 
    using (var response = request.GetResponse()) 
    using (var responseStream = response.GetResponseStream()) 
    { 
     html.Load(responseStream); 
    } 

    foreach (var absoluteHref in html.DocumentNode.SelectNodes("//a[starts-with(@href, 'http')]")) 
    { 
     Console.WriteLine(absoluteHref.Attributes["href"].Value); 
    } 
} 
+0

質問をもう少し慎重に読んでいれば、正規表現を使って[X] HTMLを解析していないことがわかります。彼は正規表現を使って 'href'属性の値をチェックしています。 -1 –

+0

これは、私がこの特定のプロジェクト(私はAgility pack:pで再構築する必要がないようにしようとしていた)にしようとしていたものに合わないため、答えとして選択したものではありません。しかし、この回答は本当に素晴らしいですし、将来の使用のために注目されるでしょう! – Danejir

関連する問題