使用AngleSharp加载资源文件

时间:2015-07-10 13:01:48

标签: c# html-parsing anglesharp

我将AngleSharp和AngleSharp.Scripting.Javascript的nuget包导入到一个空项目中,看看是否可以在应用javascript / css后解析网页中的html(如无头浏览器)。

我使用http://pycoders.com/archive/(导航到在浏览器中使用javascript填充的简报档案)作为测试网址。

显示内联javascript功能的基本示例脚本适用于我,并且在加载html之后处理javascript ...但是加载具有var document = await browseingContext.OpenAsync(new Url("http://pycoders.com/archive/"), CancellationToken.None);的实际网页不处理从中加载的脚本/ css外部文件资源。

试图调试该问题导致我将IResourceLoader接口实现为我自己项目中AngleSharp中包含的默认ResourceLoader的副本,似乎为网站返回了favicon资源响应流,但是第一个样式资源文件( https://s3.amazonaws.com/pycoders2/css/bootstrap.css)未被WebRequest加载到ResponseStream中。

public async Task<IResponse> RequestAsync(CancellationToken cancellationToken)
{
    ...

     _http.BeginGetResponse(ReceiveResponse, null);
     await _completed.Task.ConfigureAwait(false);

     if (cancellationToken.IsCancellationRequested)
        return null;

    return GetResponse();
}

对于上面的css资源文件,正在运行的代码将转到行_http.BeginGetResponse(ReceiveResponse, null);,但永远不会调用RecieveResponse方法。

我希望有人可以帮我在AngleSharp中加载资源,因为它看起来像是一个下降的html解析器,javascript / css预处理可以很好地完成它,消除了我对phantomjs和Selenium的需求。

编辑:

当呈现html时当前正在运行的资源任务的更多细节如下:

https://s3.amazonaws.com/pycoders2/img/favicon.ico - RanToCompletion

https://s3.amazonaws.com/pycoders2/img/favicon.ico - RanToCompletion

https://s3.amazonaws.com/pycoders2/css/bootstrap.css - WaitingForActivation

https://s3.amazonaws.com/pycoders2/css/main.css - WaitingForActivation

http://fonts.googleapis.com/css?family=Lato:300,400,900 - RanToCompletion

https://s3.amazonaws.com/pycoders2/img/header.png - WaitingForActivation

http://us4.campaign-archive1.com/generate-js/?u=9735795484d2e4c204da82a29&fid=1817&show=200 - RanToCompletion

https://code.jquery.com/jquery-1.10.2.min.js - RanToCompletion

https://s3.amazonaws.com/pycoders2/js/bootstrap.min.js - WaitingForActivation

1 个答案:

答案 0 :(得分:1)

目前,我最好的猜测是集成的HTTP请求者无法处理SSL证书(过去遇到过这个问题;对于大多数页面,它都有效 - 对某些人而言,它没有)。由于AWS实例也接受“http”请求,您是否可以尝试将URL修改为http://s3.amazonaws.com/pycoders2/css/bootstrap.css?作为一个邪恶的黑客,您可以包装现有的HTTP请求者,并将其与从 https 修改为 http 的URL一起使用。

那会有用吗?

备注:我尝试允许所有SSL请求。这可以在HttpWebRequest的常规.NET版本中实现。不幸的是,PCL版本没有这样的选择。