2015-06-07 24 views
5

La pagina Web utilizza javascript per creare il suo html, quindi ho bisogno di un parser html con supporto js.
Ho trovato anglesharp ma non riesco a farlo funzionare.Analisi della pagina Web JavaScript in C# con AngleSharp

using AngleSharp; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Text; 
using System.Threading.Tasks; 

namespace AngleSharpScraping 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      GetMkvToolNix(); 
      Console.ReadKey(); 
     } 

     static async void GetMkvToolNix() 
     { 
      // Create a new configuration with javascript interpreter. 
      var config = new Configuration().WithJavaScript(); 

      // Parsing process. 
      var document = await BrowsingContext.New(config).OpenAsync(Url.Create("http://www.fosshub.com/MKVToolNix.html")); 
      var link = document.QuerySelector("body > div.container.page-content > div > div.col-sm-9 > article > div.main-dl-box > p:nth-child(2) > a.dwl-link.xlink").GetAttribute("data"); 

      Console.WriteLine(link); 
     } 
    } 
} 
+0

Potrebbe voler esaminare [PhantomJS] (http://phantomjs.org/) – AlliterativeAlice

+1

PhantomJS è un'applicazione esterna con js api. Anche alcuni antivirus lo vedono come una minaccia e mostrano brutti popup di avvertimento. – baltazer

risposta

2

AngleSharp è un parser di testo. Se si desidera analizzare le pagine Web dinamiche con JS, è necessario un browser headless.

This answer fornisce un paio di opzioni (almeno una versione gratuita e open source: WebKit.NET).

+5

AngleSharp esegue JavaScript con Jint: 'var config = new Configuration(). WithJavaScript();' BrowsingContext deve comportarsi come un browser reale con sessione e gestione dei cookie. – baltazer

3

AngleSharp fornisce solo un parser HTML e CSS. Tuttavia, AngleSharp può essere esteso con funzionalità JavaScript. In questo momento il pacchetto che hai usato (AngleSharp.Scripting.JavaScript) è sperimentale e più o meno una prova di concetto.

I file JavaScript sulla pagina sono ancora troppo complessi per il supporto sperimentale. Il mio sforzo è quello di consentire il supporto per tali scenari il prima possibile, ma al momento dirò che WebKit.NET è probabilmente la soluzione migliore per risolvere il problema.

Un'altra possibile soluzione potrebbe essere l'utilizzo del driver C# per Selenium.

Non correlato all'intero argomento JavaScript: se si desidera caricare risorse esterne è necessario fornire un requester (http) appropriato. Il modo più semplice per farlo è quello di utilizzare quella di default:

var config = new Configuration().WithDefaultLoader(); 
var document = await BrowsingContext.New(config).OpenAsync("http://www.fosshub.com/MKVToolNix.html"); 
// ... 

In questa impostazione documenti esterni vengono caricati, ma altre risorse (ad esempio, le immagini, gli script, ...) non sono caricati.

+0

Prima ho avuto alcuni strani problemi con il selenio, come mostrare un errore del browser o mostrare la finestra di accesso al firewall. WebKit.NET sembra non mantenuto o morto. Su NuGet trovo CefSharp ma l'ho trovato complicato. – baltazer

+0

Vedo, beh, appendere lì e cerco di migliorare il supporto per JS. Solo il tempo è una risorsa limitata qui. –

+0

Qualcuno ha ottenuto 'Metodo 'EvaluateScriptAsync' nel tipo 'AngleSharp.Scripting.JavaScript.JavaScriptEngine' dall'assembly 'AngleSharp.Scripting.JavaScript, Version = 0.3.1.26954, Culture = neutral, PublicKeyToken = null' non ha un'implementazione. ? semplicemente eseguendo 'new Configuration(). WithJavaScript()'? Sto ottenendo la stessa cosa usando 'Configuration.Default.WithJavaScript()' – Veverke

Problemi correlati