6

我正在使用 a 构建一个 C# 应用程序,WebBrowser并且我试图找出一种阻止图像的方法,即让它们在网站加载时不显示(以便网站加载更容易)。

我试图<img>通过获取标签webBrowser1.DocumentText并使用来删除图像来删除标签,但是当我使用代码时Regex.Replace,它会显示一个空白页面。aaa有没有更好的方法来删除图像?非常感谢任何帮助。

代码:

var html_source = webBrowser1.DocumentText;
var newOne = Regex.Replace(html_source, "<img.*/>", "", RegexOptions.Multiline);
webBrowser1.DocumentText = newOne + "aaa";

更新:

我已经尝试了下面的代码(仅用于测试),但仍然显示我只是aaa.

var html_source = webBrowser1.DocumentText;
webBrowser1.DocumentText = html_source + "aaa";
4

6 回答 6

4

Webbrowser 控件使用与 Internet Explorer 相同的设置。

您可以轻松禁用图像,但请注意,它会影响 Internet Explorer,以及您的网络浏览器控件(以及其他使用 Internet Explorer 功能的程序)

禁止加载图像:

1.) 打开智能资源管理器

2.) 转到“工具”>“互联网选项”

3.) 转到“高级”选项卡

4.)向下滚动,直到找到“显示图片”复选框,然后取消选中它(它位于“多媒体”部分)

此更改的效果存储在我相信的注册表中,因此您也应该能够以编程方式对其进行编辑。但是请记住,它不仅会影响您的应用程序。

于 2013-03-05T15:10:23.553 回答
4

你可以试试这个:

private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
  if (webBrowser1.Document != null)
  {
     foreach (HtmlElement imgElemt in webBrowser1.Document.Images)
     {
        imgElemt.SetAttribute("src", "");
     }
   }
}
于 2013-01-27T16:29:30.780 回答
4

编辑

在 SO 和一个完整的项目上找到了这个问题,它可以帮助你在codeproject.com上。在这个例子中,有一个使用 webBrowser COM 组件的 userControl。正如我在原始答案中所写,我认为不可能阻止 .net Framework WebBrowser 加载图像。在浏览器控件接收到纯 html 文本后,您需要访问以下级别以拦截加载图像。

...控件中最模糊和最重要的部分是IDispatch_Invoke_Handler()。...如何实现 IDispatch::Invoke限制 IE 显示的内容(例如图像、ActiveX 控件、Java)。我发现,如果您在代码中添加一个 IDispatch_Invoke_Handler() 方法,COM 调度标识符为 -5512,那么它就可以完成这项工作。一个非常晦涩的答案,但效果很好......

原来的

你可以试试这个

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
     Debug.WriteLine("documentCompleted");
     HtmlDocument doc = webBrowser1.Document;
     foreach (HtmlElement  imgElemt in doc.Images)
     {
         imgElemt.SetAttribute("src", "");
     }
}

但正如 MSDN 所说

处理 DocumentCompleted 事件以在新文档完成加载时接收通知。当 DocumentCompleted 事件发生时,新文档已完全加载,这意味着您可以通过 Document、DocumentText 或 DocumentStream 属性访问其内容。

我认为您不能使用 .net 框架中的 webBrowser 控件来执行此操作。

于 2012-08-31T07:34:36.667 回答
3

最近,我需要拦截和分析网络浏览器控件中的所有通信。我认为我使用的技术可以帮助你。

你需要什么:

  • Awesomium.Net:基于 Chromium 引擎的 .net 控件
  • Fiddler Core:一个 http 内存代理,允许你监控 http 通信。
  • HtmlAgility 包:根据您选择的解决方案,HAP 可以帮助您以比正则表达式更可靠的方式动态更改 html 内容的 DOM。

我选择使用 Awesomium 是因为它提供了比开箱即用的 Web 浏览器控件更多的功能。就我而言,它允许我定义要使用的代理而不是系统范围的设置。

Fiddler Core 用于拦截通信。它的 API 提供了在发出请求时拦截/篡改/...的方法。在我的情况下,我只是将响应正文转发到我的业务类,但在你的情况下,你应该能够过滤 mime-type 以更改 HTML DOM(使用 HtmlAgility 包!!!!!!)或返回非 200图像的 http 状态。

这是我使用的代码。我的应用程序是 WPF,但您可以通过一些努力使其适应 winform:

public partial class App : Application
{
    static App()
    {
        // First, we set up the internal proxy
        SetupInternalProxy();
        // The we set up the awesomium engine
        SetupBrowser();
    }
    private static void SetupInternalProxy()
    {
        // My requirement is to get response content, so I use this event.
        // You may use other handlers if you have to tamper data.
        FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete;
        FiddlerApplication.Log.OnLogString += (o, s) => Debug.WriteLine(s);

        FiddlerCoreStartupFlags oFCSF = FiddlerCoreStartupFlags.Default;

        //this line is important as it will avoid changing the proxy for the whole system.
        oFCSF = (oFCSF & ~FiddlerCoreStartupFlags.RegisterAsSystemProxy);

        FiddlerApplication.Startup(0, oFCSF);

    }
    private static void SetupBrowser()
    {
        // We may be a new window in the same process.
        if (!WebCore.IsRunning)
        {
            // Setup WebCore with plugins enabled.
            WebCoreConfig config = new WebCoreConfig
            {
                // Here we plug the internal proxy to the awesomium engine
                ProxyServer = "http://127.0.0.1:" + FiddlerApplication.oProxy.ListenPort.ToString(),
                // Adapt others options related to your needs
                EnablePlugins = true,
                SaveCacheAndCookies = true,
                UserDataPath = Environment.ExpandEnvironmentVariables(@"%APPDATA%\MyApp"),
            };
            WebCore.Initialize(config);
        }
        else
        {
            throw new InvalidOperationException("WebCore should be already running");
        }
    }
    // Here is the handler where I intercept the response
    private static void FiddlerApplication_AfterSessionComplete(Session oSession)
    {
        // Send to business objects
        DoSomethingWith(
            oSession.PathAndQuery,
            oSession.ResponseBody,
            oSession["Response", "Content-Type"]
            );

    }
}

正如我在评论中所说,您可以使用 AfterSessionComplete 的另一个事件处理程序。这取决于您的要求(阅读提琴手核心 SDK 以获得帮助)。

最后一句话:此代码从应用程序类(相当于 Winform 中的 Program 类)运行。为了在 windows 类中使用结果,您可能需要使用消息传递系统或发布全局事件(注意内存泄漏)。您还必须知道 AfterSessionComplete 事件是从多个线程触发的,有时是同时触发的。您将使用某种 Invoking 在 UI 线程中工作。

于 2012-08-31T08:52:23.320 回答
1
HtmlElementCollection elc = WebBrowser1.Document.GetElementsByTagName("img");
foreach (HtmlElement el in elc)
{
   if (el.GetAttribute("src") != null)
   {
       el.SetAttribute("src", "");
   }
}

如果有任何元素可能包含图像,那么它将在img标签中。

于 2013-06-04T03:05:58.193 回答
0

You can use the Lazy Load load technique for this purpose. See http://engineering.slideshare.net/2011/03/faster-page-loads-with-image-lazy-loading/

于 2012-08-31T07:31:39.117 回答