好的,所以我被困在看似简单的网页刮擦上。我的目标是刮掉Morningstar.com,根据输入的网址检索基金名称。以下是我的代码示例:
library(rvest)
url <- html("http://www.morningstar.com/funds/xnas/fbalx/quote.html")
url %>%
read_html() %>%
html_node('r_title')
我希望它会返回Fidelity Balanced Fund这个名称,但我得到以下错误:{xml_missing}
连连呢?
亚伦
编辑:
我也尝试通过XHR请求进行抓取,但我认为我的问题是不知道要选择哪个css选择器或xpath来查找相应的数据。
XHR代码:
get.morningstar.Table1 <- function(Symbol.i,htmlnode){
try(res <- GET(url = "http://quotes.morningstar.com/fundq/c-header",
query = list(
t=Symbol.i,
region="usa",
culture="en-US",
version="RET",
test="QuoteiFrame"
)
))
tryCatch(x <- content(res) %>%
html_nodes(htmlnode) %>%
html_text() %>%
trimws()
, error = function(e) x <-NA)
return(x)
} #HTML Node in this case is a vkey
仍然是同样的问题,我使用正确的css / xpath来查找吗? XHR代码适用于具有明确css选择器的请求。
答案 0 :(得分:1)
好的,所以看起来页面会动态加载您定位的部分,因此它实际上并没有被read_html()拉入。有趣的是,页面的这一部分也没有使用RSelenium无头浏览器加载。
我能够通过抓取页面标题(实际上隐藏在页面上)并使用一些正则表达式来摆脱垃圾来实现这一点:
library(rvest)
url <- 'http://www.morningstar.com/funds/xnas/fbalx/quote.html'
page <- read_html(url)
title <- page %>%
html_node('title') %>%
html_text()
symbol <- 'FBALX'
regex <- paste0(symbol, " (.*) ", symbol, ".*")
cleanTitle <- gsub(regex, '\\1', title)
作为附注,为了将来使用,您对html_node()的第一次调用应包含“。”。在您定位的课程名称之前:
mypage %>%
html_node('.myClass')
同样,这在这种特定情况下没有帮助,因为页面无法加载我们试图抓取的部分。
最后一点:其他网站包含相同的信息,更容易被抓(如雅虎财经)。