0

私はこのコードを持っています:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    WebRequest request = WebRequest.Create(url);
    request.Method = "GET";
    WebResponse response = request.GetResponse();
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);
    string content = reader.ReadToEnd();
    int start = content.IndexOf("profile/");
    int end = content.IndexOf("'");
    string result = content.Substring(start, end - start - 1);
    reader.Close();
    response.Close();
}

たとえば、私は長い行を持っています:

<span class="message-profile-name" ><a  href='/profile/daniel'>daniel</a></span>: <span class="message-text">hello everyone<wbr/> <img class='emoticon emoticon-tongue' src='/t.gif'/></span>

新しい文字列を作成したい:daniel hello Everyone

どうすればいいですか?私のコードでは、エラー例外が発生します。

ArgumentOutOfRangeException長さをゼロ未満にすることはできません。パラメータ名:長さ

オンライン:string result = content.Substring(start, end - start - 1); この場合:start = 19572 end = 2110

4

3 に答える 3

1

手動で解析する代わりに、 HtmlAgilityPackを使用してください。

var wc = new WebClient();

wc.DownloadStringCompleted += (s, e) =>
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(e.Result);

    var link = doc.DocumentNode
                    .SelectSingleNode("//span[@class='message-profile-name']")
                    .Element("a")
                    .Attributes["href"].Value;
};

wc.DownloadStringAsync(new Uri("http://chatroll.com/rotternet"));
于 2012-08-09T21:31:46.317 に答える
0

必要な文字列は常にprofile/xxx形式のhrefで囲まれているようです。コンテンツをテキスト形式にすると、正規表現を使用すると簡単になります。正規表現を使用すると、次のような可能性がある場合でも機能します。複数の<ahref=...>要素を持つ

Match match = Regex.Match(content, @"(?<=<a\s*?href='/profile/\w*?'>\s*?)\w*?(?=\s*?<\s*?/a\s*?>)");
string result = match.Value;

すべての太字に一致し、.Valueは要素の値を返します。この場合はダニエルです。正規表現の前に(i?)を付けて、大文字と小文字を区別せずにリストの最後の項目にも一致させることもできます。

  • <a href='/profile/daniel'> daniel </a>
  • <a href='/profile/danielbc'> daniel </a>
  • <a href='/profilex/danielbc'> daniel </a>
  • <a href='/profile/danielbc'> daniel </a>
  • <ahref='/profile/danielbc'>ダニエル</a>
  • <ahref='/PROFILE/danielbc'>ダニエル</a>

アップデート:

他の種類の要素からコンテンツを取得するには、強調表示されたセクションを要素に一致するように置き換えるだけです(?<= <a \ s *?href ='/ profile / \ w *?'> \ s *?)\ w *?(?= \ s *?<\ s *?/ a \ s *?>)。あなたの場合、"message-text">hello everyone<wbr/>?i)(?<= "message-text" \ s *?> \ s *?。*?(?= \ s *?<\ s *?/ wbr \ s *?>そしてそれは次のバリエーション、。*?あらゆるもの(スペースや句読点を含む)に一致することを意味しますが、可能な限り少なくします。返信から終了タグを変更したことに注意してください。ではなくそれを機能させるために行うことができる小さな変更です

  • "message-text">みなさん、こんにちは</ wbr>
  • <wbrasdfjlds"message-text">みなさんこんにちは</wbr>
  • <wbr"message-text">みなさんこんにちは</wbr>
于 2012-08-09T22:39:13.100 に答える
0

シンボル配列を意味のあるデータ配列に分割するには、適切なツールを使用してください

HtmlAgilityPackを使用して文字列を解析し、意味のあるトークンのツリーを返すことができます。

その後、それらを繰り返し処理し、独自のロジックに基づいて結果文字列に集約できます。

于 2012-08-09T21:30:22.590 に答える