htmlAgilityPack Load () 메서드는 아무 작업도 수행하지 않습니다.

c# html-agility-pack winforms

문제

htmlAgilityPack을 사용하여 웹 사이트의 콘텐츠를 가져옵니다.

private String getImageUrl(String websiteUrl)
{
    HtmlAgilityPack.HtmlDocument docHtml = new HtmlWeb().Load(websiteUrl);
    // ...
}

두 번째 줄에서 중단 점에 도달하지 않습니다. 첫 번째 줄은 예외를 throw하지 않습니다. URL은 이미 존재하며 사용 가능합니다.

docHtml도 null이 아니에요, 그냥 실행하지 않는 것, noly 내 스레드를 죽일.

이 문제를 어떻게 처리 할 수 ​​있습니까? / 무슨 일이 일어나고 있는지에 대한 자세한 정보를 얻으려면 어떻게해야합니까?

편집 : 함수는 내 메인 폼에 의해 인스턴스화 된 클래스에서 호출됩니다. 호출 클래스는 스레드를 실행합니다. 제 수업의 첫 번째 인스턴스는 작동하지만 두 번째 인스턴스는 작동하지 않습니다.

class Image
{
    BackgroundWorker downloadWorker = new BackgroundWorker();

    private String fileName;
    private String directory;
    private String url;

    RichTextBox rtxtStatus;


    public Image(String _fileName, String _directory, String _url)
    {
        fileName = _fileName;
        directory = _directory;
        url = _url;

        downloadWorker.WorkerReportsProgress = true;

        downloadWorker.WorkerSupportsCancellation = true;

        downloadWorker.DoWork += new DoWorkEventHandler(worker_doWork);
        downloadWorker.ProgressChanged += new ProgressChangedEventHandler(worker_progressChanged);
        downloadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_runWorkerCompleted);
    }

    private void worker_doWork(object sender, DoWorkEventArgs e)
    {
        download();
    }

    private void download()
    {
        WebClient downloadClient = new WebClient();

        if (!Directory.Exists(directory))
        {
            MessageBox.Show("Directory to save image not found.");
        }
        else
        {
            HttpWebRequest HttpReq = (HttpWebRequest)WebRequest.Create(url);

            HttpWebResponse response;
            try
            {
                response = (HttpWebResponse)HttpReq.GetResponse();
            }
            catch (WebException ex)
            {
                response = (HttpWebResponse)ex.Response;
            }

            if (response.StatusCode == HttpStatusCode.OK)
            {
                string image = getImageUrl(url);

                // Replace HTML-Characters
                image = WebUtility.HtmlDecode(image);
                string saveName = directory + @"\" + fileName + ".png";
            }
            try
            {
                downloadClient.DownloadFile(image, saveName);
            }
            catch (Exception)
            {
                MessageBox.Show("Error while downloading");
            }                                       
        }
    }

    private void worker_progressChanged(object sender, ProgressChangedEventArgs e)
    {
        // Nothing to do
    }

    private void worker_runWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            MessageBox.Show("Download cancelled, please check URL.");
        }
        rtxtStatus.AppendText("\nDownload finished.");
    }



    Properties.Settings.Default.SaveFileLocation = directory;
    Properties.Settings.Default.Save();
}

// this method is called from outside on image-object.
public void downloadImage(RichTextBox _rtxtStatus)
{
    rtxtStatus = _rtxtStatus;
    if (!downloadWorker.IsBusy)
    {
        downloadWorker.RunWorkerAsync();
    }
    else
    {
        MessageBox.Show("Download already running.");
    }
}
private String getImageUrl(String websiteUrl)
{
    HtmlAgilityPack.HtmlDocument docHtml = new HtmlWeb().Load(websiteUrl);
    var nodes = docHtml.DocumentNode.SelectNodes("//img");
    return nodes[0].Attributes["src"].Value;
}

인기 답변

어쩌면 도달하려는 사이트에 쿠키가 활성화되어 있어야합니다. HtmlWeb 객체에 CookieContainer 를 추가하고 Load 메서드를 시도하십시오.

HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.PreRequest += request =>
    {
        request.CookieContainer = new System.Net.CookieContainer();
        return true;
    };
var htmlDoc = htmlWeb.Load(yourUrl);


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.