使用rvest

时间:2018-04-26 15:31:15

标签: r web-scraping rvest

我正在尝试提取类似于以下内容的表的所有链接:

<!DOCTYPE html>
<html>
<body>

<table>
  <tr>
    <td>
      <a href="https://www.r-project.org/">R</a><br>
      <a href="https://www.rstudio.com/">RStudio</a>
    </td>
  </tr>
  <tr>
    <td>
      <a href="https://community.rstudio.com/">Rstudio Community</a>
    </td>
  </tr>
</table>

</body>
</html>

我想要做的是在结尾处获取数据帧(或向量)列表,其中每个数据帧包含html表中每行的所有链接。例如,在这种情况下,列表将具有带有c("https://www.r-project.org/","https://www.rstudio.com/")的向量1,而第二个向量将是c("https://community.rstudio.com/")。我现在遇到的主要问题是,当我执行以下操作时,我无法保持每个节点的href关系:

library(rvest)

web <- read_html("table.html") %>%
  html_nodes("table") %>%
  html_nodes("tr") %>%
  html_nodes("a") %>%
  html_attr("href")

1 个答案:

答案 0 :(得分:1)

一种方法是添加用"a"替换html_node字词的搜索,这将生成每个tr中仅第一个网址的列表。然后,您可以使用它将完整列表拆分为组。

page <- read_html("table.html") #just read the html once

web <- page %>%
  html_nodes("table") %>% html_nodes("tr") %>% html_nodes("a") %>%
  html_attr("href") #as above

web2 <- page %>%
  html_nodes("table") %>% html_nodes("tr") %>% html_node("a") %>%
  html_attr("href") #just the first url in each tr

webdf <- data.frame(web=web, #full list
                    group=cumsum(web %in% web2), #grouping indicator by tr
                    stringsAsFactors=FALSE)

webdf
                             web group
1     https://www.r-project.org/     1
2       https://www.rstudio.com/     1
3 https://community.rstudio.com/     2