html - 使用 R 抓取带有图像、文本和空白单元格的维基百科 HTML 表格

标签 html r web-scraping rvest

我感兴趣的表格是纽约市米其林星级餐厅的维基百科表格,获得的星级数以图片表示。

Screenshot of wikipedia table

我能够使用两个步骤来抓取表格(首先获取“名称”和“自治市镇”列中的单词,其次获取表格主体中的 alt 标签),但我想知道是否可以完成一步到位。我能够使用 rvest 包抓取数据。

由于 XML::readHTMLTable 函数无法读取维基百科页面,我尝试了 htmltab 包但没有成功,因为我无法弄清楚 bodyFun 参数所需的函数。说实话,我是网络抓取......和功能的新手。

我引用的问题:

Scraping html table with images using XML R package

Scraping html tables into R data frames using the XML package

这是我的代码:

library(stringr)
library(rvest)
library(data.table)

url <- "http://en.wikipedia.org/wiki/List_of_Michelin_starred_restaurants_in_New_York_City"

#Scrape the first two columns, restaurant name and borough
name.boro <- url %>% read_html() %>% html_nodes("table") %>% html_table(fill = TRUE)
name.boro <- as.data.table(name.boro[[1]])
name.boro[, 3:length(name.boro) := NULL]
135 * 13 #1,755 cells in first table

#scrape tables for img alt 
#note that because I used the "td" node, entries for all cells in all tables were pulled
stars <- url %>% read_html() %>% html_nodes("td") %>% html_node("img") %>% html_attr("alt")
stars 

#Make vector of numbers to index each column
df <- vector("list", 13)
for (i in 1:13){
  df[[i]] <- seq(i, 1755, 13)
}

#Put everything together
Mich.Guide <- name.boro 
Mich.Guide[, c("X2006", "X2007", "X2008", "X2009", "X2010", "X2011", "X2012", "X2013", "X2014", "X2015", 
               "X2016") := .(stars[unlist(df[3])], stars[unlist(df[4])], stars[unlist(df[5])], 
                             stars[unlist(df[6])], stars[unlist(df[7])], stars[unlist(df[8])], 
                             stars[unlist(df[9])], stars[unlist(df[10])], stars[unlist(df[11])], 
                             stars[unlist(df[12])], stars[unlist(df[13])] )]

谢谢!

最佳答案

你可以试试下面的方法

require(rvest)
url <- "http://en.wikipedia.org/wiki/List_of_Michelin_starred_restaurants_in_New_York_City"
doc <- read_html(url)
col_names <- doc %>% html_nodes("#mw-content-text > table > tr:nth-child(1) > th") %>% html_text()
tbody <- doc %>% html_nodes("#mw-content-text > table > tr:not(:first-child)")

extract_tr <- function(tr){
  scope <- tr %>% html_children()
  c(scope[1:2] %>% html_text(),
    scope[3:length(scope)] %>% html_node("img") %>% html_attr("alt"))
}

res <- tbody %>% sapply(extract_tr)
res <- as.data.frame(t(res), stringsAsFactors = FALSE)
colnames(res) <- col_names

现在您有了原始表。我将列的解析留给整数,列名留给你

关于html - 使用 R 抓取带有图像、文本和空白单元格的维基百科 HTML 表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38808008/

相关文章:

python - 从(古代)SAS 版本 6(适用于 Python/R)读取 .ssd01 数据文件

javascript - 如何查找表单参数的存储位置并在请求中使用它们

python - 使用正则表达式从 HTML 中提取所有值

javascript - 我的 javascript 处理我的幻灯片图像横幅哪里出了问题?

javascript - zIndex 位置为 :relative: not working chrome and safari

javascript - 使用 CSS 的广告牌文本

r - 在 R 中使用多线程包

r - 无法使用 textbf 写粗体字符

javascript - 在 DOM 元素内部选择

python - 为什么我在尝试从 Google Scholar 抓取数据时会得到重复的输出?