微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 rvest 将单个高级类别链接到该类别中的多个项目

如何解决使用 rvest 将单个高级类别链接到该类别中的多个项目

首先,如果这个问题的标题不清楚,我很抱歉 - 让我试着解释一下。我正在从 www.bbc.co.uk/iplayer 抓取一些数据。该网站的结构有大约 10 个类别(例如体育、戏剧、流行),其中大约有 10 个节目。我已经设法抓取了我需要的大部分数据(节目标题、类型和概要),并且我知道如何将这些数据组合成一个新的数据框。到目前为止,这是我的代码

df <- read_html("https://www.bbc.co.uk/iplayer")

title <- df %>%
    html_nodes("div.content-item__title.typo.typo--skylark.typo--bold") %>%
    html_text()
genre <- df %>%
    html_nodes("div.content-item__labels") %>%
    html_text()
synopsis <- df %>%
    html_nodes("div.content-item__info__primary") %>%
    html_text()

### Combine into a tabble/tibble ###
df2 <- tibble(title=title,genre=genre,synopsis=synopsis)

问题在于“类别”存在于更高的层次上,并且只有大约 10 个(而有 110 多个单独的节目/流派/概要)。

我知道获取类别的代码

category <- df %>%
    html_nodes("div.section__header") %>%
    html_text()

但是,这仅返回大约 10 个类别,因此无法将其与其他值组合到一个表中。我想要的是一个包括类别的决赛桌 - 例如如果第一个类别中有 10 个标题,并且该类别被称为“最受欢迎”,则在 category 列中应为所有 10 个标题显示“最受欢迎”。

希望一切都清楚了。如有必要,很乐意详细说明。

解决方法

您可以使用 purrr::map_dfr 将函数应用于每个 section 节点。在这种情况下,该函数将返回每个部分所需信息的 tibblemap_dfr 然后将这些小标题映射到最终的 DataFrame。在 tibble 中,较短的 header 将被回收以匹配其他列的长度。

library(rvest)
library(purrr)
library(dplyr)

get_section_data <- function(section){
  
  t <- tibble(
    header = section %>% html_node('h2') %>% html_text(),title = section %>% html_nodes('.content-item__title') %>% html_text(),genre = section %>% html_nodes('.content-item__labels') %>% html_text(),synopsis = section %>% html_nodes('.content-item__info__primary') %>% html_text()
  )
  return(t)
}

page <- read_html('https://www.bbc.co.uk/iplayer')
sections <- page %>% html_nodes('.section__content')
results <- purrr::map_dfr(sections,get_section_data)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?