查看this chart:
我想在给定时间点提取音量信息(当光标在音量图表中移动时,音量显示在图表标题中) - 例如:
[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除其他外,我在以下地方寻找灵感(但无法提出解决方案):
答案 0 :(得分:1)
您正在寻找的数据并不是真正适合自动提取的数据,但我们可以使用它。来自this answer的getElementByVal()
函数可以重构为创建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
怎么办?匹配的文本将在area
元素中找到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')