2013-07-28 44 views
0

綜觀this chart如何使用Google Script從網頁中提取圖表工具提示值?

  • 我想在給定的時間點,以提取卷信息(卷顯示在圖表標題,當光標在音量圖表移動) - 例如:

    [Fri. Jul 26, 2013 13:25:00] Volume 118 
    
  • 被存儲在圖表上爲:

    < area shape="rect" coords="541,463,542,471" onmousemove="showStudyTooltip(event, 'B', '[Fri. Jul 26, 2013 13:25:00]', 'Volume', '118.0000000')" > 
    

這是怎麼做到的?

請注意,它不僅僅是'音量',我想要提取,但也可以添加在體積圖下面的不同指標值。

PS在別人我尋找靈感以下位置(但一直未能拿出一個解決方案):

回答

1

的數據你正在尋找因爲對於自動提取並不是非常好的,但我們可以使用它。從this answergetElementByVal()功能可重構製造getElementsByVal(),這將返回所有匹配的文檔元素的數組,給我們事情做進一步的搜索。

/** 
* Traverse the given XmlElement, and return an array of matches. 
* Note: 'class' is stripped during parsing and cannot be used for 
* searching, I don't know why. 
* <pre> 
* Example: getElementsByVal(body, 'input', 'value', 'Go'); will find 
* 
*   <input type="submit" name="btn" value="Go" id="btn" class="submit buttonGradient" /> 
* </pre> 
* 
* @param {XmlElement} element XML document element to start search at. 
* @param {String}  id  HTML <div> id to find. 
* 
* @return {[XmlElements]}  All matching elements (in doc order). 
*/ 
function getElementsByVal(element, elementType, attr, val) { 

    var results = []; 
    // If the current element matches, remember it. 
    if (element[attr] 
     && element[attr] == val 
     && element.getName().getLocalName() == elementType) { 
    results.push(element); 
    } 

    // Check element's children 
    var elList = element.getElements(); 
    var i = elList.length; 
    while (i--) { 
    // (Recursive) Check each child, in document order. 
    results = results.concat(getElementsByVal(elList[i], elementType, attr, val)); 
    } 
    // Return summary of matches 
    return results; 
} 

要使用這個新的輔助功能,如果我們創建了一個函數getIndicators(),該函數接受包含我們感興趣的時間點的String參數 - 例如,Mon. Jul 29, 2013 07:40:00?匹配的文本將在元素中找到,該元素得到shape="rect",我們將在名爲onmousemove的屬性中找到它。下面是我們的函數:

function getIndicators(timeString) { 
    var txt = UrlFetchApp.fetch("http://www.barchart.com/chart.php?sym=DXU13&t=BAR&size=M&v=2&g=1&p=I:5&d=L&qb=1&style=technical&template=").getContentText(); 
    var doc = Xml.parse(txt,true); 
    var body = doc.html.body; 
    var indicators = "not found"; 

    // Look for elements matching: < area shape="rect" ... > 
    var chartPoints = getElementsByVal(body, 'area', 'shape', 'rect'); 

    // Search for the chartPoint with tooltip containing the time we care about 
    for (var i=0; i<chartPoints.length; i++) { 
    if (chartPoints[i].onmousemove.indexOf(timeString) > -1) { 
     // found our match 
     indicators = chartPoints[i].onmousemove; 
    } 
    } 

    return indicators 
} 

既然這樣,它會返回一個分配給onmousemove整個文本值;智能解析的練習留給你。

這是一個測試功能,以幫助:

function test_getIndicators() { 
    Logger.log(getIndicators("Mon. Jul 29, 2013 07:40:00")); 
} 

運行時,這裏的日誌(今天,反正...):

[13-07-29 16:47:47:266 EDT] showOHLCTooltip(event, 'B', '[Mon. Jul 29, 2013 07:40:00]', 'DXU13', '81.8050000', '81.8300000', '81.8000000', '81.8200000') 
+0

Mogsdad,太感謝你了您的詳細和翔實的答案。這正是我一直在尋找的東西(而且我沒有在我的電腦前經過無數個小時後自己生產)。它完美的工作!我非常感謝您花時間和精力來幫助我,謝謝stackoverflow.com擁有這樣一個偉大的網站 - 它真的幫了我很多時間,當尋找具體的編碼問題的答案時。 – user2628114

相關問題