C#在UL中单击LI以进行Web绘图。

时间:2018-01-19 16:03:56

标签: javascript c# html automation screen-scraping

我正在尝试抓一页:https://www.investing.com/equities/statoil-technical

我想要实现的是点击5分钟,15分钟,30分钟等等,并阅读点击后发生变化的Pivot Points表。

我尝试了很多不同的方法。 System.Windows.Forms.Browser,ChromiumWebBrowser(Cef)和现在使用JavaScript的ChromiumWebBrowser。

像这样:

         script = " var ul = document.getElementById('pairSublinksLevel1'); " +
            " var items = ul.getElementsByTagName('li'); " +
            " var Financials = 0; " +

            // Find and click the Financials Botton
            " for (var o = 0; o < items.length; o++) " +
            " { " +
            "   if (items[o].textContent = 'Financials') {" +
            "   Financials = o;}" +
            " } " +
            " items[Financials].click() ; " +

            // should I set " setTimeout(function(){}, 3000); " ?

            " var lis = document.getElementById('pairSublinksLevel1').getElementsByTagName('li'); " +
            " var TechnicalAnalysis = 0; " +

            // Find and click the Technical Analysis sub menu
            " for (var o = 0; o < lis.length; o++) " +
            " { " +
            "   if (lis[o].textContent = 'Technical Analysis') {" +
            "   TechnicalAnalysis = o;}" +
            " } " +

            " lis[TechnicalAnalysis].click();" +
            // should I set " setTimeout(function(){}, 3000); " ?


            // Get the bottons ( 5mins, 15mins, 30mins etc)
            " var TimePeriods = document.getElementById('timePeriodsWidget').getElementsByTagName('li'); " +
            " TimePeriods[5].click(); " +
            // should I set " setTimeout(function(){}, 3000); " ?

            " var x = document.getElementById('curr_table'); " + 
            " var xHTML= x.innerHTML ;";

            var task = LocalBrowser.EvaluateScriptAsync(script, timeout);
            task.Wait();

问题是当我将“TimePeriods [5] .click();”更改为按钮3或1或其他任何内容时,xHTML不会改变。

我在DOM中尝试过这个。我试过在浏览器中。 我被卡住了。

有人可以向我倾斜正确的方向吗? 向我展示如何点击LI:

<ul class="tabsBoxSubMenu techStudiesTabsSubMenu innerPage " id="timePeriodsWidget" data-view="normal">
<li pairid="376" data-period="300" class="first">
<li pairid="376" data-period="900" class="">
<li pairid="376" data-period="1800" class="">
<li pairid="376" data-period="3600" class="selected ">
<li pairid="376" data-period="18000" class="">
<li pairid="376" data-period="86400" class="">
<li pairid="376" data-period="week" class="">
<li pairid="376" data-period="month" class="">
</ul>

并获得

<table class="genTbl closedTbl crossRatesTbl" id="curr_table">
<thead>
<tr>
<th class="first left noWrap">Name</th>
<th class="noWrap">S3</th>
<th class="noWrap">S2</th>
<th class="noWrap">S1</th>
<th class="noWrap">Pivot Points</th>
<th class="noWrap">R1</th>
<th class="noWrap">R2</th>
<th class="noWrap">R3</th>
</tr>
</thead>
<tbody>
</table>

LI点击生成的代码?

由于 哈康

1 个答案:

答案 0 :(得分:0)

问题是您尝试点击LI元素,但加载表格和更改HTML的操作实际上是由A的子LI元素触发的

所以,像TimePeriods[5].children[0].click();这样的东西可以胜任。

  

//我应该设置&#34; setTimeout(function(){},3000); &#34; ?

是的,您可以使用setTimeout来延迟对表中数据的爬行或使用某种DOM更改检测技术,因为单击会触发AJAX调用,而表中的数据很可能不会立即可用。

无论如何,我必须建议你抓取politely,因为这个过程会使目标网站超载,甚至可能会产生法律影响。