如何用rvest抓取网页数据并生成保留嵌套结构的Data Frame
提取每本书的所有作者并生成以作者为维度的Data Frame
网页结构数据
books <- minimal_html(' <div> <div class="book"> <div class="booktitle">Book 1</div> <div class="year">1999</div> <div class="author">Author 1</div> <div class="author">Author 2</div> <div class="author">Author 3</div> </div> <div class="book"> <div class="booktitle">Book 2</div> <div class="year">2022</div> <div class="author">Author 4</div> </div> <div class="book"> <div class="booktitle">Book 3</div> <div class="year">1845</div> <div class="author">Author 5</div> <div class="author">Author 6</div> <div class="author">Author 7</div> <div class="author">Author 8</div> </div> </div>')
需求说明
需要生成一个Data Frame(或tibble),以作者为维度,每行包含书名、年份、作者三个字段,最终共8行数据(对应所有作者)。
简便实现方案
利用rvest结合purrr的map_df函数,直接遍历每本书的节点,一次性提取对应数据并合并成目标格式,无需额外的遍历和格式转换:
library(rvest) library(purrr) result <- books %>% html_elements(".book") %>% map_df(function(book_node) { # 提取当前书的标题和年份 title <- book_node %>% html_element(".booktitle") %>% html_text2() year <- book_node %>% html_element(".year") %>% html_text2() # 提取当前书的所有作者 authors <- book_node %>% html_elements(".author") %>% html_text2() # 将当前书的信息与每个作者配对,生成tibble tibble( 书名 = title, 年份 = year, 作者 = authors ) }) # 查看结果 print(result)
代码说明
html_elements(".book"):先获取所有书籍节点;map_df(...):遍历每个书籍节点,在节点内部提取对应数据,返回的每个小tibble会自动合并成最终的大Data Frame;- 每个书籍节点内,提取标题、年份后,提取所有作者,利用tibble的自动扩展特性,将标题和年份与每个作者一一配对,自然生成多行数据。
运行后得到的结果如下:
# A tibble: 8 × 3 书名 年份 作者 <chr> <chr> <chr> 1 Book 1 1999 Author 1 2 Book 1 1999 Author 2 3 Book 1 1999 Author 3 4 Book 2 2022 Author 4 5 Book 3 1845 Author 5 6 Book 3 1845 Author 6 7 Book 3 1845 Author 7 8 Book 3 1845 Author 8
内容的提问来源于stack exchange,提问作者bill999
相关产品推荐
相关产品推荐

