4

在 WebBrowser 中显示之前,我必须更改内部 html 代码。

测试页面 - http://aksmod.ru/skajrim-mod-kukri-ot-aksyonov-v5-0/

我尝试使用 AngleSharp.Scripting,但它无法正常工作(广告无法加载

var config = new Configuration().WithDefaultLoader().WithJavaScript();
var document = BrowsingContext.New(config).OpenAsync(address).Result;

//do something 

return document.DocumentElement.OuterHtml;

后来想了想LoadCompleted,结果还是一样

private void Wb_LoadCompleted(object sender, NavigationEventArgs e)
{
    Console.WriteLine("Loaded");
    string url = e.Uri.ToString();
    if (!(url.StartsWith("http://") || url.StartsWith("https://")))
    { }
    if (e.Uri.AbsolutePath != wb.Source.AbsolutePath)
    { }
    else
    {
        Console.WriteLine("Full Loaded");
        HTMLDocument html = (HTMLDocument)wb.Document;
        var value = html.getElementsByTagName("html").item(index: 0);
        //do something
        wb.NavigateToString(value.OuterHtml);
    }
}

该事件只是不会触发(尽管它适用于其他一些站点)。

那么,我错过了什么?

更新 1

MCVE

XAML

<Grid>
    <WebBrowser Name="wb" />
</Grid>

背后的代码

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        wb.Navigated += Wb_Navigated;
        wb.LoadCompleted += Wb_LoadCompleted;
        wb.Navigate("http://aksmod.ru/skajrim-mod-kukri-ot-aksyonov-v5-0/");
    }

private void Wb_LoadCompleted(object sender, NavigationEventArgs e)
{
    Console.WriteLine("Loaded");
    string url = e.Uri.ToString();
    if (!(url.StartsWith("http://") || url.StartsWith("https://")))
    { }
    if (e.Uri.AbsolutePath != wb.Source.AbsolutePath)
    { }
    else
    {
        Console.WriteLine("Full Loaded");
        HTMLDocument html = (HTMLDocument)wb.Document;
        var value = html.getElementsByTagName("html").item(index: 0);
        //do something
        wb.NavigateToString(value.OuterHtml);
    }
}

    private void Wb_Navigated(object sender, NavigationEventArgs e)
    {

        FieldInfo fiComWebBrowser = typeof(WebBrowser)
            .GetField("_axIWebBrowser2",
                      BindingFlags.Instance | BindingFlags.NonPublic);
        if (fiComWebBrowser == null) return;
        object objComWebBrowser = fiComWebBrowser.GetValue(wb);
        if (objComWebBrowser == null) return;
        objComWebBrowser.GetType().InvokeMember(
            "Silent", BindingFlags.SetProperty, null, objComWebBrowser,
            new object[] { true });

        Console.WriteLine("Navigated");
    }
}
4

2 回答 2

3

广告作为 iFrame 嵌入到您展示的页面中。就我而言,iFrame 中加载的广告 URL 类似于https://cdn.254a.com/images/hosted/elv/retargeting/v5/728x90.html ?...(使用网络浏览器的检查器工具检查)

广告可能不允许在您的页面中使用 iframe(检查广告在 X-Frame-Options 标题字段中返回的内容)。如果这是问题所在,应该可以为广告实施代理,并让代理更改 X-Frame-Options 标头。

在这种情况下,如果广告 URL 是 https(而不仅仅是 http),您需要创建一个充当中间人的代理。请参阅X-Frame-Options 标头有什么意义?. 但是您可以用您的代理 URL 替换 URL,使用 ARGS 中的原始 URL。代理充当 HTTPS 客户端,获取内容,代理能够修改标头,并仅通过 HTTP 将内容返回到您的页面。

于 2017-10-22T10:50:46.480 回答
-1

您可以使用:http : //html-agility-pack.net 在 C# 上操作 Html 代码。

于 2017-10-23T05:24:01.907 回答