【发布时间】:2018-08-08 20:15:43
【问题描述】:
这个问题的最终目标是在一列中创建一个 URL 数据框,并在另一列中创建该页面的标题。我将解释我的方法 - 但请随意使用网站列表而不是 html 文件来解释它。
创建 html 文件列表的原因是某些 URL 在直接使用 read_html 对网站列表进行抓取时会产生错误。 try 函数可以解决这个问题。
for (i in 1:nrow(uniques)) {
try(download.file(uniques$URL.Found.On[i],
destfile = paste("scrapedpage", i, "html", sep = "."), quiet=TRUE))
}
这会生成一个包含 11k 个网站的列表。但是,可能是因为我使用了 try 函数,它创建了一些下一个函数不会读取的 html 文件。
content <- NULL
for (i in 1:nrow(uniques)) {
content[i] <- read_html(paste("scrapedpage", i, "html", sep = ".")) %>%
html_nodes("h1") %>% html_text()
}
这适用于我列表的前三项,所以我知道我在正确的轨道上,但它并没有遍历整个列表。我收到以下消息:
内容错误[i] % : 替换的长度为零
可能是该列表中的第 4 个 html 文件没有“h1”标头,还是其他一些因素限制了此函数的有用性?
如果没有找到“h1”,有没有办法只留下 NA,这样它就不会破坏 for 循环?也许添加一个 ifelse 语句?任何想法都表示赞赏。
提前致谢。
【问题讨论】:
-
您的
read_html(paste("scrapedpage", i, "html", sep = ".")) %>% html_nodes("h1") %>% html_text()块是否适用于单个文件? -
另外,我不会使用
nrow(uniques)作为您的第二个循环索引。我推荐for (i in list.files(pattern=('.*\\.html$"))),因为nrow(uniques)可能不等于废弃页面的数量。 -
另外,
content需要初始化content <- list() -
嗨,Mako。是的,我初始化了内容变量,但忘记在帖子中提及。接得好。至于关于唯一性等于抓取页面的价值的问题——确实如此。我有 html 文件的文件夹来证明这一点。对于块处理单个文件的问题,它适用于我文件夹中的许多 html 文件,但不是所有文件。个别网站上的输出示例包括:“弗吉尼亚州社会行为科学机构审查委员会”。和“其他教师准备资源”
标签: html r for-loop if-statement rvest