2

AngleSharp および AngleSharp.Scripting.Javascript の nuget パッケージを空のプロジェクトにインポートして、javascript/css を適用した後に Web ページから html を解析できるかどうかを確認しました (ヘッドレス ブラウザーのように)。

http://pycoders.com/archive/ (ブラウザーで JavaScript を使用して入力されたニュースレターのアーカイブに移動します) をテスト URL として使用しています。

インラインJavaScript機能を示す基本的なサンプルスクリプトは私にとっては機能し、JavaScriptはhtmlがロードされた後に処理されます...しかし、実際のWebページを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でリソースをロードするのを手伝ってくれることを願っています.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

4

1 に答える 1

1

現時点では、統合された HTTP リクエスターが SSL 証明書を処理できないと考えられます (過去にこの問題がありました。ほとんどのページでは機能しますが、一部のページでは機能しません)。AWS インスタンスは「http」リクエストも受け付けているので、URL を に変更してみてもらえますhttp://s3.amazonaws.com/pycoders2/css/bootstrap.cssか? 邪悪なハックとして、既存の HTTP リクエスターをラップし、それをhttpsからhttpに変更した URL で使用することができます。

それはうまくいきますか?

備考: すべての SSL リクエストを許可しようとしました。これは、 の通常の .NET バージョンで可能HttpWebRequestです。残念ながら、PCL バージョンにはそのようなオプションはありません。

于 2015-07-10T15:15:52.593 に答える