进入另一个问题。我有一个for循环,其中包含用于从id为batting_gamelogs的表中删除击球信息的URL。如果该页面上不存在该ID,则转到下一个URL,否则刮掉该表。
我认为下面应该是这样的,但我无法让它发挥作用。
if xpathSApply(batting, '//*[@id != "batting_gamelogs"]')[[1]] next
else
{
tableNode <- xpathSApply(batting, '//*[@id="batting_gamelogs"]')[[1]]
data <- readHTMLTable(tableNode, stringsAsFactors = FALSE)
data # select the first table
total <- cbind(id,year,data)
batlist <- rbind(batlist, total)
}
我附上了示例代码。
#SCRAPE BATTING STATS
data = NULL
batlist = NULL
battingURLs <- paste("http://www.baseball-reference.com",yplist[,c("hrefs")],sep="")
for(thisbattingURL in battingURLs){
batting <- htmlParse(thisbattingURL)
fstampid <- regexpr("&", thisbattingURL, fixed=TRUE)-1
fstampyr <- regexpr("year=", thisbattingURL, fixed=TRUE)+5
id <- substr(thisbattingURL, 53, fstampid)
year <- substr(thisbattingURL, fstampyr, 75)
tableNode <- xpathSApply(batting, '//*[@id="batting_gamelogs"]')[[1]]
data <- readHTMLTable(tableNode, stringsAsFactors = FALSE)
data # select the first table
total <- cbind(id,year,data)
batlist <- rbind(batlist, total)
}
batlist
非常感谢任何帮助!
答案 0 :(得分:0)
我无法让它发挥作用。
这句话应该总是提醒你说实际发生了什么(以及它与你预期的发生方式有何不同)。我怀疑发生的事情是它经常跳过(而不是跳过它应该有的)。但你可以告诉我们,而不是让我们弄明白。
if xpathSApply(batting, '//*[@id != "batting_gamelogs"]')[[1]] next
“不”是在错误的地方。在这里,您要说的是,如果页面上有一个元素,其id
属性的值不是batting_gamelogs
,请跳过此迭代。相反,如果页面上的 no 元素具有{em> id
的{{1}}属性,则您希望跳过此迭代。
因此,请将此用于XPath表达式:
batting_gamelogs
并将“not”放在'//*[@id = "batting_gamelogs"]'
之外,测试结果列表的长度是否为零(感谢https://stackoverflow.com/a/25553805/423105的答案):
xpathSApply()
我拿出了if (length(xpathSApply(batting, '//*[@id = "batting_gamelogs"]')) == 0) next
,因为您只想测试是否返回任何值;你不关心提取第一个结果。