【问题标题】:Loading resource files with AngleSharp使用 AngleSharp 加载资源文件
【发布时间】:2015-09-29 05:52:05
【问题描述】:

我将 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 的副本,并且似乎为网站返回了网站图标资源响应流,但第一个样式资源文件 ( 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

【问题讨论】:

  • 你使用的是什么配置?您还使用最新版本的 AngleSharp (v0.8.6) 还是以前的版本之一? SSL 可能是您的文件未加载的原因。由于 AngleSharp 是 PCL,它只能为(糟糕的)HttpWebRequest 提供有限的选项。不幸的是,它不可能可靠地使用 SSL 和/或 GZIP - 因此它只是一个功能有限的默认实现(总比没有好)。
  • 作为补充说明:AngleSharp.Scripting.JavaScript 包是可用的,是的,但它目前处于高度试验阶段,远未准备好生产。我试图在未来让它变得更好,但老实说,这是一项巨大的努力,而且该项目缺乏贡献者。因此,我不知道什么时候可以称之为生产就绪。
  • 嘿弗洛里安感谢您的回复。我正在使用的配置是这样的: var config = Configuration.Default.WithJavaScript().WithCss().WithCookies().With(new ASLoaderService(GetHttpRequesters()));这与来自 github 的示例中的配置相同,除了我加载了我自己实现的 LoaderService,它主要是用于调试的默认 LoaderService 的副本

标签: c# html-parsing anglesharp


【解决方案1】:

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

那么它会起作用吗?

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

【讨论】:

  • 我向ServicePointManager.ServerCertificateValidationCallback 添加了一个处理程序,它为ssl 验证返回true,并在我的ResourceLoader 类中添加了一个静态IEnumerable&lt;Task&gt;,这样我就可以在继续显示javascript 呈现的html 之前使用Task.WaitAll,但是应用程序挂在Task.WaitAll
  • 查看我对当前任务状态的编辑,所有这些都是 amazonaws url
  • 没有太多代码很难说什么(MWE 演示这个问题会很棒),但只是一个简单的问题:如果你放弃WaitAll,应用程序/请求的性能如何?请求是否正确完成?
  • @John Earnshaw 有什么解决办法吗?
猜你喜欢
  • 2020-08-28
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多