0

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

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            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();
            reader.Close();
            response.Close();

        }

今、私は2つの機能を持っています:

private void GetProfileNames(string text)
        {
            string startTag = "<a  href='/profile/";
            string endTag = "'>";
            int startTagWidth = startTag.Length;
            int endTagWidth = endTag.Length;
            index = 0;
            while (true)
            {
                index = text.IndexOf(startTag, index);
                if (index == -1)
                {
                    break;
                }
                // else more to do - index now is positioned at first character of startTag 
                int start = index + startTagWidth;
                index = text.IndexOf(endTag, start + 1);
                if (index == -1)
                {
                    break;
                }
                // found the endTag 
                profileName = text.Substring(start, index - start);
            }
            return profileName;
        }

        private void GetTextFromProfile(string text)
        {
            string str = "<span class=\"message-text\">";
            string startTag = str;
            string endTag = "<";
            int startTagWidth = startTag.Length;
            int endTagWidth = endTag.Length;
            index = 0;
            while (true)
            {
                index = text.IndexOf(startTag, index);
                if (index == -1)
                {
                    break;
                }
                // else more to do - index now is positioned at first character of startTag 
                int start = index + startTagWidth;
                index = text.IndexOf(endTag, start + 1);
                if (index == -1)
                {
                    break;
                }
                // found the endTag 
                profileNameText = text.Substring(start, index - start);
            }

            return profileNameText;
        }

DoWork イベントの文字列コンテンツ行の後、関数 GetProfileNames を呼び出しましたが、行でブレークポイントを使用している場合: profileNameText = text.Substring(start, index - start); 私はいつも同じプロファイル名を取得しています。プログラムを閉じてもう一度実行する必要があります。

私がやりたいことは、Dowork イベントで関数を呼び出すときに、GetProFileNames 関数を最後まで作成し、ダウンロードされた現在のコンテンツからすべてのプロファイル名を取得することです。


どういうわけか、GetProfileNames と GetTextFromProfile の両方の関数を呼び出す必要があり、各プロファイルの文字列と彼に属するテキストを作成する必要があります。

たとえば、コンテンツ変数に次の行があります。

<span class="message-profile-name" ><a  href='/profile/LipazD'>LipazD</a></span>: <span class="message-text">hello world</span>

したがって、両方の関数がコンテンツをループする必要があり、反復が行われるたびに、string t = "LipazD hello world" のような文字列が取得されます。次の反復は、"Daniel how are you ?" になります。

関数はプロファイル名を取得し、2番目の関数はテキストを取得しますが、反復ループを作成してすべてを機能させる方法がわかりません。


次に、コンテンツのループが終了し、各プロファイル名のすべてのプロファイル名とテキストを取得したら、コンテンツを削除して新しいコンテンツを再度ダウンロードし、機能が終了してコンテンツを削除するか、新しいコンテンツをダウンロードしてもう一度実行する必要があります。何度も何度も。

4

2 に答える 2

0
HtmlDocument doc = new HtmlDocument();
WebClient wc = new WebClient();

doc.Load(wc.DownloadString("http://yourUri.com"));
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//span[@class='message-profile-name'"])
{
    // etc.
}

しかし、 message-profile-name と message-text は親要素にラップされていると思います。その要素をループして、子プロファイル名とコメント スパンのコンテンツを取得することをお勧めします

于 2012-08-10T15:00:12.740 に答える
0
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-10T17:59:06.570 に答える