首页 > web前端 > js教程 > 如何通过 .NET WebBrowser 有效检索动态生成的 HTML?

如何通过 .NET WebBrowser 有效检索动态生成的 HTML?

DDD
发布: 2024-10-18 08:37:29
原创
357 人浏览过

How to Retrieve Dynamically Generated HTML via .NET WebBrowser Effectively?

如何使用 .NET WebBrowser 提取动态生成的 HTML

此讨论围绕动态检索 Web 呈现的 HTML 内容的挑战.NET 应用程序中的浏览器。

问题:

现有解决方案主要关注 System.Windows.Forms.WebBrowser 类或 mshtml.HTMLDocument 接口,但没有令人满意的结果。从 WebClient 或 mshtml.HTMLDocument 检索原始 HTML 不会提供浏览器渲染生成的动态内容。

研究方法:

  • 使用 Web 浏览器访问文档类无法检索渲染的 HTML。
  • 使用 mshtml.HTMLDocument 并解析下载的原始 HTML 也产生了不令人满意的结果。

优雅的解决方案:

虽然最终的解决方案可能会根据具体要求而有所不同,但技术组合可以提供强大的解决方案:

  1. WebBrowser 控件: 嵌入 WebBrowser 控件以导航到所需的 URL .
  2. 状态监控:监控DocumentCompleted事件并检查IsBusy属性,直到渲染完成。
  3. 异步/等待:利用async/await来处理异步轮询并简化代码流程。
  4. HTML5 渲染:使用浏览器功能控制启用 HTML5 渲染以确保最新的渲染行为。

代码示例:

以下代码示例结合了这些技术来提取动态 HTML 内容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

<code class="csharp">using System;

using System.Threading;

using System.Threading.Tasks;

using System.Windows.Forms;

using mshtml;

 

namespace HtmlExtractor

{

    public partial class MainForm : Form

    {

        public MainForm()

        {

            SetFeatureBrowserEmulation();

            InitializeComponent();

            this.Load += MainForm_Load;

        }

 

        async void MainForm_Load(object sender, EventArgs e)

        {

            try

            {

                var cts = new CancellationTokenSource(10000); // cancel in 10s

                var html = await LoadDynamicPage("https://www.google.com/#q=where+am+i", cts.Token);

                MessageBox.Show(html.Substring(0, 1024) + "..."); // it's too long!

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

        async Task<string> LoadDynamicPage(string url, CancellationToken token)

        {

            var tcs = new TaskCompletionSource<bool>();

            WebBrowserDocumentCompletedEventHandler handler = (s, arg) =>

                tcs.TrySetResult(true);

 

            using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true))

            {

                this.webBrowser.DocumentCompleted += handler;

                try

                {

                    this.webBrowser.Navigate(url);

                    await tcs.Task; // wait for DocumentCompleted

                }

                finally

                {

                    this.webBrowser.DocumentCompleted -= handler;

                }

            }

 

            var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0];

 

            var html = documentElement.OuterHtml;

            while (true)

            {

                await Task.Delay(500, token);

                if (this.webBrowser.IsBusy)

                    continue;

 

                var htmlNow = documentElement.OuterHtml;

                if (html == htmlNow)

                    break;

 

                html = htmlNow;

            }

 

            token.ThrowIfCancellationRequested();

            return html;

        }

 

        static void SetFeatureBrowserEmulation()

        {

            if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)

                return;

            var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

            Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",

                appName, 10000, RegistryValueKind.DWord);

        }

    }

}</code>

登录后复制

这种方法提供了一种更全面、更高效的方法来提取动态生成的内容.NET 应用程序中来自 Web 浏览器的 HTML 内容。

以上是如何通过 .NET WebBrowser 有效检索动态生成的 HTML?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板