2014-10-28 4 views
0

Некоторые из данных, которые я хочу очистить, содержатся на страницах JavaScript. Он похож на этот рисунок:Очистить данные массива JavaScript с помощью CsQuery

<script type="text/javascript"> 
     arrayName["field1"] = 12; 
     arrayName["field2"] = 42; 
     arrayName["field3"] = 1442; 
</script> 
<script type="text/javascript"> 
     arrayName["field4"] = 62; 
     arrayName["field5"] = 3; 
     arrayName["field6"] = 542; 
</script> 

Он смешался с черным множеством других Javascript. Мне нужно получить эти значения.

Я начал так:

var dom = CQ.CreateFromUrl("http://somesite.xxx"); 

CQ script = dom["script[type='text/javascript']"]; 

Но я не могу думать теперь, как захватить эти данные. Единственный способ сделать это, чтобы создать регулярное выражение и перебрать все, или есть другой способ, который имеет лучшую производительность?

Я не вижу, как использовать селектор CSS для фактического кода JavaScript. Должен ли я попробовать другой подход?

ответ

0

Похоже, вы действительно ищете двигатель на стороне сервера Javascript - CsQuery вы можете получить содержимое из сценария теги достаточно легко, но тогда вам нужно на самом деле запустить скрипт, а затем быть в состоянии для ссылки на созданные объекты. Хотя теоретически можно было создать какой-то язык запросов для анализа строк сценария, реальность такова, что в основном его запускает. Если вам нужно вытащить только определенные строки, содержащие простые назначения, а контекст не важен, то вы, вероятно, смотрите на нечто такое же простое, как регулярные выражения (или даже grep), чтобы отфильтровать то, что вам нужно.

Я использовал обертку Neosis V8 - http://javascriptdotnet.codeplex.com/ - также на nuget как Neosis.Javascript.

Это так же быстро, как и все (поскольку он использует двигатель V8 от Google под капотом); единственный реальный недостаток - это не чистое .NET-решение, но как только оно настроено, оно довольно безболезненно. Пример его использования - в моем проекте https://github.com/jamietre/SharpLinter, который использует его для запуска JsHint.

Существует множество 100% -ых Javascript-движков .NET, таких как Jint, IronJS и Jurassic. Раньше я использовал Jurassic, и это, вероятно, самый быстрый, поскольку он компилируется в байт-код. Это на удивление полно, но на самом деле не активно развивается, и поэтому, вероятно, будет трудно получить большую поддержку. Но все они намного, гораздо медленнее, чем V8, и не имеют никаких реальных преимуществ, кроме наличия не-NET-ссылок.

Если вы действительно, действительно нужно, чтобы это было 100% .net, просто используйте JavscriptDotNet.

+0

Поблагодарите Джейми, я иду по этой аллее. Это немного сложный исполняемый сценарий отдельно от страницы, но я использую регулярное выражение для того, чтобы прибирать вещи и, похоже, работает. Также просто подумал, что могу сказать большое спасибо за CsQuery. Я использовал HAP раньше, и CsQuery намного лучше, это экономит мне много времени! – Guerrilla

1

Возможно, это будет не очень быстро, но вы можете попробовать использовать элемент управления WebBrowser для этого. Позвольте ему перейти на страницу, а затем выполнить собственный Javascript для извлечения данных. Пример:

var url = "http://example.com"; 
object arrayName; 
var thread = new Thread(() => 
{ 
    var browser = new WebBrowser { ScriptErrorsSuppressed = true }; 

    // prevent popups 
    browser.NewWindow += (sender, e) => 
    { 
     e.Cancel = true; 
    }; 

    browser.DocumentCompleted += (sender, eventArgs) => 
    { 
     // call the Javascript eval() function, and pass it a string of what we want to evaluate. By passing "arrayName", it will simply return the value of that variable in the global scope. 
     arrayName = browser.Document.InvokeScript("eval", new object[] { "arrayName" }); 

     browser.Dispose(); 
     Application.ExitThread(); 
    }; 

    browser.Navigate(url); 

    Application.Run(); 
}); 

// you need this when using a WebBrowser control in a console app 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 
thread.Join(); 

// now you should have something stored in the arrayName variable 
+0

Мне нужно очистить эти данные каждый раз, когда я получаю запрос, поэтому я считаю, что управление веб-браузером слишком велико. В идеале я хочу, чтобы перейти к javascript, как я могу HTML, если не думаю, что это должно быть регулярное выражение или что-то подобное. – Guerrilla

+0

Если производительность является проблемой, попробуйте использовать интерпретатор Javascript, например [jint] (https://www.nuget.org/packages/Jint), чтобы оценить код, который вы найдете с помощью селектора тегов скриптов. –

+0

У меня был краткий взгляд на jint, но документация была краткой, и я не мог видеть простой способ отбросить весь скрипт и сделать eval. У меня будет другой взгляд, если я смогу найти несколько примеров в Интернете. Спасибо – Guerrilla

Смежные вопросы