1

単純な(そして奇妙な)問題があります。プロパティを HTML 文字列に手動で設定するとWebBrowser.DocumentText、ランダムな文字の後で途切れてしまいます。私が使用する HTML は、他のページのプレーンな HTML であり、HtmlAgilityPack を介してダウンロードされます (実際のアプリケーションでは、何らかの処理を行いますが、何も処理しなくてもバグは存在します)。Internet Explorer で同じページを読み込むと、ページ全体が正しくレンダリングされます。

最小限の例を次に示します。

const string url = "http://www.zip-codes.com/county/IL-COOK.asp";
var doc = new HtmlWeb().Load(url);

HtmlNode basehref = new HtmlNode(HtmlNodeType.Element, doc, 0) { Name = "base" };
basehref.Attributes.Add("href", url.Substring(0, url.LastIndexOf("/") + 1));
doc.DocumentNode.SelectSingleNode("//head").ChildNodes.Insert(0, basehref);

string html;
using (var writer = new StringWriter()) {
    doc.Save(writer);
    html = writer.ToString();
}

var thread = new Thread(() => {
    var browser = new WebBrowser {
        Location = new Point(0, 0),
        Size = new Size(1920, 1080),
        ScriptErrorsSuppressed = true,
        AllowNavigation = true,
        DocumentText = html
    };
    browser.DocumentCompleted += (sender, e) => {
        Console.WriteLine(html.Length);
        Console.WriteLine(browser.DocumentText.Length);
        Application.ExitThread();
    };
    Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();

以下を出力します。

35259
20477
4

2 に答える 2

3

私はあなたのコードを試してみApplication.ExitThread()ましたが、それがDocumentCompleted2回起動され、2回目は長さが正しいように見えます。したがって、読み込もうとしている Web サイトには、おそらく何らかの動的コンテンツが含まれているか、それ自体が更新されています。私はそれが何をするのかを掘り下げていませんが、先に進んですべてのスクリプト、スタイル、iframe を削除しました:

    const string url = "http://www.zip-codes.com/county/IL-COOK.asp";
    var doc = new HtmlWeb().Load(url);

    doc.DocumentNode.Descendants()
                    .Where(n => n.Name == "script" || n.Name == "style" || n.Name == "iframe")
                    .ToList()
                    .ForEach(n => n.Remove());

DocumentCompleted一度起動されるようになり、ドキュメントの長さは一貫しています。

于 2013-08-15T02:43:20.837 に答える