Как использовать R (пакеты Rcurl / XML) для очистки данных опций от Yahoo? - PullRequest
2 голосов
/ 25 апреля 2011

По сути, я хочу ежедневно очищать некоторые данные опций от Yahoo! Финансы. Я пинаю шины, используя (1) в качестве примера. Однако это не совсем сработало, так как я незнаком с HTML.

(1) Извлечение HTML-таблиц в R-фреймы данных с использованием пакета XML

В качестве примера я хочу наскрести и собрать следующую цепочку опций http://finance.yahoo.com/q/op?s=MNTA&m=2011-05

Вот то, что я пробовал до сих пор. Последние 2 строки не работают, так как мне неясно, какой класс мне нужно искать. Любая помощь будет отличной. Благодаря.

library(RCurl)
library(XML)

theurl <- "http://finance.yahoo.com/q/op?s=MNTA&m=2011-05"
webpage <- getURL(theurl)
webpage <- readLines(tc <- textConnection(webpage)); close(tc)

pagetree <- htmlTreeParse(webpage, error=function(...){}, useInternalNodes = TRUE)

tablehead <- xpathSApply(pagetree, "//*/table[@class='yfnc_datamodoutline1']/tr/th", xmlValue)

results <- xpathSApply(pagetree, "//*/table[@class='wikitable sortable']/tr/td", xmlValue)

Последние две строки не пишут

1 Ответ

3 голосов
/ 25 апреля 2011

Я полагаю, что вы хотите получить информацию в двух таблицах Параметры вызова и Параметры размещения. Вот один простой способ сделать это, используя пакет XML

url  = "http://finance.yahoo.com/q/op?s=MNTA&m=2011-05"
# extract all tables on the page
tabs = readHTMLTable(url, stringsAsFactors = F)

# locate tables containing call and put information
call_tab = tabs[[11]]
put_tab  = tabs[[15]]

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

EDIT. Две таблицы, которые, вероятно, вас заинтересуют, имеют cellpadding = 3. Вы можете использовать эту информацию для непосредственного извлечения двух таблиц, используя следующий код

# parse url into html tree
doc = htmlTreeParse(url, useInternalNodes = T)

# find all table nodes with attribute cellpadding = 3
tab_nodes = xpathApply(doc, "//table[@cellpadding = '3']")

# parse the two nodes into tables
tabs = lapply(tab_nodes, readHTMLTable)
names(tabs) = c("calls", "puts")

Это список, который содержит обе таблицы.

...