【问题标题】:How to scrape page headers (ie: html_nodes("h1")) from a list of html files using rvest?如何使用rvest从html文件列表中抓取页面标题(即:html_nodes(“h1”))?
【发布时间】: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 = ".")) %&gt;% html_nodes("h1") %&gt;% html_text() 块是否适用于单个文件?
  • 另外,我不会使用nrow(uniques) 作为您的第二个循环索引。我推荐for (i in list.files(pattern=('.*\\.html$"))),因为nrow(uniques) 可能不等于废弃页面的数量。
  • 另外,content需要初始化content &lt;- list()
  • 嗨,Mako。是的,我初始化了内容变量,但忘记在帖子中提及。接得好。至于关于唯一性等于抓取页面的价值的问题——确实如此。我有 html 文件的文件夹来证明这一点。对于块处理单个文件的问题,它适用于我文件夹中的许多 html 文件,但不是所有文件。个别网站上的输出示例包括:“弗吉尼亚州社会行为科学机构审查委员会”。和“其他教师准备资源”

标签: html r for-loop if-statement rvest


【解决方案1】:

尝试将其包装在 tryCatch 块中,如果某些文件失败,这应该会捕获它并打印您的错误,同时让代码完成:

for (i in 1:nrow(uniques)) {
    tryCatch({ 
      content[i] <- read_html(paste("scrapedpage", i, "html", sep = ".")) %>% 
      html_nodes("h1") %>% html_text()
     }, error = function(e) print(sprintf("Error in: %i %s", i, as.character(e)))
    )
}

【讨论】:

  • 只是想补充一下,您是对的,原始下载文件功能在可能的 11,075 项中生成了 10,778 项,这可能意味着某些网站可能存在服务器问题。了解一个函数来快速识别它们是有用的。
  • 假设下载失败时会引发错误,您可以将第一条语句中的 try 替换为另一个 tryCatch 块,然后它将返回失败列表,类似于我的回答第二部分。您可以更改function(e) 之后的代码以写入文件,而不是登录到控制台。
猜你喜欢
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多