对于循环跳过,如果表不存在

时间:2015-06-03 15:35:35

标签: r xpath

进入另一个问题。我有一个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

非常感谢任何帮助!

1 个答案:

答案 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 ,因为您只想测试是否返回任何值;你不关心提取第一个结果。