2015-07-10 94 views
2

我將用於AngleSharp和AngleSharp.Scripting.Javascript的nuget包導入空項目,以查看是否可以在應用javascript/css(如無頭瀏覽器)後從網頁解析html。使用AngleSharp加載資源文件

我使用http://pycoders.com/archive/(導航到在瀏覽器中使用javascript填充的新聞通訊檔案)作爲測試網址。

顯示內嵌javascript功能的基本示例腳本適用於我,而javascript在加載html後處理等......但加載實際網頁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

+0

你使用什麼配置?你還使用最新版本的AngleSharp(v0.8.6)還是以前的版本? SSL可能是您的文件未加載的原因。由於AngleSharp是PCL,它只能提供有限選項的(糟糕的)'HttpWebRequest'。不幸的是,它不可能可靠地使用SSL和/或GZIP - 因此它只是一個具有有限能力的默認實現(總比沒有好)。 –

+0

作爲補充說明:可以使用AngleSharp.Scripting.JavaScript軟件包,但是它目前是高度實驗性的,遠遠沒有準備好生產。我試圖在未來做得更好,但說實話,這是一項巨大的努力,項目缺乏貢獻者。因此,我不知道什麼時候可以將其稱爲生產準備。 –

+0

嘿弗洛裏安感謝您的答覆。我使用的配置是:var config = Configuration.Default.WithJavaScript()。WithCss()。WithCookies()。With(new ASLoaderService(GetHttpRequesters()));這與github中的示例中的配置相同,除了我加載我自己實現的LoaderService,它主要是您的默認LoaderService的副本以用於調試 –

回答

1

目前我最好的猜測是集成的HTTP請求者無法處理SSL證書(過去有這個問題;對於大多數頁面而言 - 對於一些它不適用)。由於AWS實例也接受「http」請求,您是否可以嘗試將URL修改爲http://s3.amazonaws.com/pycoders2/css/bootstrap.css?作爲一個邪惡的黑客,你可以包裝現有的HTTP請求者,並使用它的URL修改從httpshttp

然後呢?

備註:我試圖允許所有SSL請求。這是在HttpWebRequest的常規.NET版本中可能的。不幸的是,PCL版本沒有提供這樣的選項。

+0

我向ServicePointManager.ServerCertificateValidationCallback添加了一個處理程序,該處理程序爲ssl驗證返回true,在我的ResourceLoader類中添加了一個靜態'IEnumerable ',所以我可以在繼續顯示JavaScript呈現的html之前使用'Task.WaitAll',但應用程序掛在'Task.WaitAll' –

+0

請參閱我對當前任務狀態的編輯,所有這些是amazonaws網址 –

+0

很難說沒有太多代碼的東西(MWE來演示這個問題會很好),但只是一個簡單的問題:如果刪除'WaitAll',應用程序/請求如何執行?請求是否正確完成? –