R 你如何将物品拼凑在一起,从而避免';不要失去索引?

R 你如何将物品拼凑在一起,从而避免';不要失去索引?,r,rvest,R,Rvest,我正在用RVest做一些基本的WebScrap,并得到返回的结果,但是数据并不一致。也就是说,我正在从站点获取项目,但它们的顺序不正确,因此我正在刮取的两个数据元素不能加入到data.frame中 library(rvest) library(tidyverse) base_url<- "https://www.uchealth.com/providers" loc <- read_html(base_url) %>% html_nodes('[class=locatio

我正在用RVest做一些基本的WebScrap,并得到返回的结果,但是数据并不一致。也就是说,我正在从站点获取项目,但它们的顺序不正确,因此我正在刮取的两个数据元素不能加入到data.frame中

library(rvest)
library(tidyverse)

base_url<- "https://www.uchealth.com/providers"
loc <- read_html(base_url) %>%
  html_nodes('[class=locations]') %>%
  html_text() 
dept <- read_html(base_url) %>%
  html_nodes('[class=department last]') %>%
  html_text()
有什么建议吗?我想知道是否有一个索引可以把这些项目放在一起,但我什么也没看到

编辑:我也试过了,但没有任何运气。该位置似乎获得了错误的起始值:

scraping <- function(

base_url = "https://www.uchealth.com/providers"
)
{
loc <- read_html(base_url) %>%
  html_nodes('[class=locations]') %>%
  html_text() 

dept <- read_html(base_url) %>%
  html_nodes('[class=specialties]') %>%
  html_text()

data.frame(
  loc = ifelse(length(loc)==0, NA, loc),
  dept = ifelse(length(dept)==0, NA, loc), 
  stringsAsFactors=F
)

}
scraping%
html_text()
部门%
html_节点('[class=specialties]')%>%
html_text()
数据帧(
loc=ifelse(长度(loc)=0,NA,loc),
dept=ifelse(长度(dept)=0,NA,loc),
系数=F
)
}

您面临的问题是,并非所有父节点中都存在每个子节点。处理这些情况的最佳方法是收集列表/向量中的所有父节点,然后使用
html\u node
函数从每个父节点提取所需信息<代码>html_节点将始终为每个节点返回一个结果,即使它是NA

library(rvest)

#read the page just onece
base_url<- "https://www.uchealth.com/providers"
page <- read_html(base_url)

#parse out the parent node for each parent
providers<-page %>% html_nodes('ul[id=providerlist]')  %>% html_children()

#parse out the requested information from each child.
dept<-providers %>% html_node("[class ^= 'department']") %>% html_text()
location<-providers %>%html_node('[class=locations]') %>% html_text()
库(rvest)
#只看一页
基本url%html\u文本()
位置%html\u节点('[class=locations]')%>%html\u文本()

提供者、部门和位置的长度都应该相等。

一个更复杂的选项是首先将每个
节点中的所有可用数据转换为一个数据帧,然后使用
dplyr::bind_rows
将它们堆叠起来。我认为这超出了您的基本要求,但它仍然以一种迂回的方式回答了您的问题,它可能对更一般的情况有用:

库(rvest)
图书馆(tidyverse)
基本url%
html_文本(T)%>%
str_split(“:”,2)%>%
映射(~str_trim(.)%%>%cbind()%%>%as_tible())%%>%
绑定列()%>%
设置_名称([1,])%>%
.[-1,]
})
#堆叠数据帧,添加人名,并对列重新排序。
ucdf%
mutate(Name=map\u chr(res\u list,~html\u节点(,“h4”)%%>%html\u文本(T))%%>%
选择(名称,1:(ncol(.)-1))
返回:

# A tibble: 1,137 x 5
   Name         Title                       Locations                                      Specialties              Department        
   <chr>        <chr>                       <chr>                                          <chr>                    <chr>             
 1 Adrian Abre… Assistant Professor of Med… UC Health Physicians Office South (West Chest… nephrology               Internal Medicine 
 2 Bassam G. A… Associate Professor of Cli… University of Cincinnati Medical Center: (513… nephrology, organ trans… Internal Medicine 
 3 Brian Adams… Professor, Director of Res… UC Health Physicians Office (Clifton - Piedmo… dermatology              Dermatology       
 4 Opeolu M. A… Associate Professor of Eme… University of Cincinnati Medical Center: (513… emergency medicine, neu… Emergency Medicine
 5 Caleb Adler… Professor in the Departmen… UC Health Psychiatry (Stetson Building): (513… psychiatrypsychology, m… Psychiatry & Beha…
 6 John Adler,… Assistant Professor of Obs… UC Health Women's Center: (513) 475-8248, UC … gynecology, robotic sur… OB/GYN            
 7 Steven S. A… Assistant Professor         UC Health Physicians Office (Clifton - Piedmo… orthopaedics, spine sur… Orthopaedics & Sp…
 8 Surabhi Aga… Assistant Professor of Med… Hoxworth Center: (513) 475-8524, UC Health Ph… rheumatology, connectiv… Internal Medicine 
 9 Saad S. Ahm… Assistant Professor of Med… Hoxworth Center: (513) 584-7217                cardiovascular disease,… Internal Medicine 
10 Syed Ahmad,… Professor of Surgery; Dire… UC Health Barrett Cancer Center: (513) 584-89… surgical oncology, canc… Surgery           
# … with 1,127 more rows
#一个tible:1137 x 5
专业部门名称、职务、地点
1 Adrian Abre…加州大学医学部健康医师办公室南部(西胸科…肾病内科)助理教授
2 Bassam G. A.,辛辛那提大学医学中心副教授,(513)肾脏科,脏器内科,内科。
布莱恩·亚当斯,教授,加州大学健康医师办公室主任(克利夫顿-皮埃莫,皮肤科)
4 Opeolu M. A.,辛辛那提大学医学中心副教授,(513)急诊科,急诊科,内科学,急救医学,急救医学,急救医学,急救医学,急救医学,急救医学,医学,急救医学,医学,医学,医学,医学,医学,医学,医学,医学,医学,医学,医学,医学,医学,医学,
5 Caleb Adler…加州大学健康精神病学系教授(Stetson大楼):(513…精神病学-心理学,m…精神病学与行为…
6约翰·阿德勒,…坎特伯雷大学健康妇女中心Obs助理教授:(513)475-8248,坎特伯雷大学…妇科学,机器人外科…OB/GYN
7 Steven S.A.。坎特伯雷大学健康医师办公室助理教授(克利夫顿-皮埃莫…。矫形外科,脊柱外科…。矫形外科和Sp…
8苏拉比·阿加……医学助理教授……霍克斯沃思中心:(513)475-8524,坎特伯雷大学健康博士……康涅狄格州风湿病学……内科
9 Saad S.Ahm…医学助理教授…霍克斯沃思中心:(513)584-7217心血管疾病,…内科学
10赛义德·艾哈迈德,…外科教授;迪雷…加州大学健康巴雷特癌症中心:(513)584-89…外科肿瘤学,癌症…外科学
#…还有1127行

我不确定是否理解您的问题,但可能是这样[似乎与我试图做的类似。我在上面编辑过,但没有任何luckSmall提示:善待网站,不要多次删除同一页面。相反,将
read\u html
输出分配给一个变量,然后从该变量中提取数据。我在
[class^='department]中没有看到
^
before。它做什么?@gersht,^表示以开头。因此
class^='department'
表示以“department”开头的类,我在理解属性或类名中的空格时遇到困难。此解决方案完全按照我的预期工作。感谢您的时间!谢谢,这看起来也是一个可行的解决方案well@Brad_J很高兴它能帮上忙。对SO表示感谢的一个好方法是向上投票,即使你不接受答案。其他人看到的投票比你看到的更多评论,让他们知道有人觉得答案很有用。
# A tibble: 1,137 x 5
   Name         Title                       Locations                                      Specialties              Department        
   <chr>        <chr>                       <chr>                                          <chr>                    <chr>             
 1 Adrian Abre… Assistant Professor of Med… UC Health Physicians Office South (West Chest… nephrology               Internal Medicine 
 2 Bassam G. A… Associate Professor of Cli… University of Cincinnati Medical Center: (513… nephrology, organ trans… Internal Medicine 
 3 Brian Adams… Professor, Director of Res… UC Health Physicians Office (Clifton - Piedmo… dermatology              Dermatology       
 4 Opeolu M. A… Associate Professor of Eme… University of Cincinnati Medical Center: (513… emergency medicine, neu… Emergency Medicine
 5 Caleb Adler… Professor in the Departmen… UC Health Psychiatry (Stetson Building): (513… psychiatrypsychology, m… Psychiatry & Beha…
 6 John Adler,… Assistant Professor of Obs… UC Health Women's Center: (513) 475-8248, UC … gynecology, robotic sur… OB/GYN            
 7 Steven S. A… Assistant Professor         UC Health Physicians Office (Clifton - Piedmo… orthopaedics, spine sur… Orthopaedics & Sp…
 8 Surabhi Aga… Assistant Professor of Med… Hoxworth Center: (513) 475-8524, UC Health Ph… rheumatology, connectiv… Internal Medicine 
 9 Saad S. Ahm… Assistant Professor of Med… Hoxworth Center: (513) 584-7217                cardiovascular disease,… Internal Medicine 
10 Syed Ahmad,… Professor of Surgery; Dire… UC Health Barrett Cancer Center: (513) 584-89… surgical oncology, canc… Surgery           
# … with 1,127 more rows