웹 사이트 소스 코드를 다운로드하고 GUI를 동결하지 않기 위해 비동기 적으로 필터링하는 웹 클리어의 예를 알려 주시겠습니까?

StackOverflow https://stackoverflow.com/questions/1634665

  •  06-07-2019
  •  | 
  •  

문제

나는 MSDN의 기사 중 일부를 읽었지만 지금은 내가 지금 필요한 것이 아닙니다.

웹 사이트를 비동기 적으로 다운로드 한 간단한 응용 프로그램 (WebClient.DownloadDataAsync)을 표시 한 다음 사이트의 제목 태그를 필터링 할 수 있습니까?

나는 내 인생을 위해 이것을 할 수 없으며, 나는 단지 명확한 컷 모델을 보려고 노력하고 있습니다.

도움이 되었습니까?

해결책

DownloadStringAsync를 사용하기가 더 쉬울 수 있습니다. 이렇게하면 HTML을 인코딩을 처리하지 않고 문자열로 구문 분석 할 수 있습니다.

제목을 구문 분석하는 방법에 따라 .NET에는 HTML 파서가 내장되어 있지 않기 때문에 조금 더 어려울 수 있습니다. 일부 Regex를 사용해 보거나 XMLREADER를 사용할 수 있지만, 컨텐츠가 잘못되거나 까다로운 콘텐츠가 있으면 문제가 될 수 있습니다.

var client = new WebClient();
client.DownloadStringCompleted += (s, args) => {
    if (args.Error == null && !args.Cancelled) {
        var regex = new Regex("<title>(?<title>.*?)</title>");
        var match = regex.Match(args.Result);
        if (match.Success)
        {
            var myTitle = match.Groups["title"].Value;
            // ... 
        }
    }
};
client.DownloadStringAsync(url);

다른 팁

다음은 사용하는 완전한 솔루션입니다 비동기 대표. 내가 사용하고 있음을 주목하십시오 컨트롤 메인 UI 스레드에서 모든 UI 상호 작용이 수행되도록하기 위해이 경우 메시지 상자를 표시합니다.

var button = new Button {Text = "Run"};
button.Click +=
    (sender, e) =>
        {
            var fetchTitle = new Func<string, string>(
                address =>
                    {
                        var html = new WebClient().DownloadString(address);
                        var match = Regex.Match(html, "<title>(.*)</title>");
                        return match.Groups[1].Value;
                    });
            var displayTitle = new Action<string>(
                title => MessageBox.Show(title));
            fetchTitle.BeginInvoke(
                "http://stackoverflow.com",
                result =>
                    {
                        var title = fetchTitle.EndInvoke(result);
                        if (button.InvokeRequired)
                        {
                            button.Invoke(displayTitle, title);
                        }
                        else
                        {
                            displayTitle(title);
                        }
                    },
                null);
        };
new Form {Controls = {button}}.ShowDialog();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top