2017-08-26 15 views
0

私はrvestを使用して内部ウェブサイトのHTMLテーブルからデータをスクラップしています。行の色は意味があるので、BGCOLOR属性を最終表の列として抽出しますが、もちろんhtml_table()は内容を抽出するだけです。ウェブスクラップしたhtmlテーブルに属性を含める方法

これまで私がこれまで持っていたことは次のとおりです。 htmlテーブルのスニペットは次のとおりです。色の列を含めるにはどうすればよいですか?

html_nodes(samplepage,"table") 
tbl_content <- samplepage %>% 
    html_nodes("table") %>% 
    html_table(fill = TRUE, trim = TRUE) 
tbl_content 

<tr BGCOLOR = "#F8C0E0"> 
<td> BASOPHILS <td> microl  <td> 0.477 <td> 0.425 <td align="center"> 0.052 <td align="center"> 1.920 <td align="center"> 51.5 <td align="center"> 32 
</tr> 
<tr BGCOLOR = "#F8F0B0"> 
<td> CALCIUM <td > mg/dl  <td> 12.2 <td> 1.7 <td align="center"> 7.6 <td align="center"> 14.9 <td align="center"> 71 <td align="center"> 33 
</tr> 

答えて

2

あなたはhtml_tableを置き換えるために、独自のパーサを構築することができます。 purrr::map_dfは、ノード(この場合はtr秒)を反復し、data.frameに結果を結合するのに便利です:

単にあまり柔軟に、あなただけの属性を引き出すことができますし、それをマージ
library(rvest) 
library(tidyverse) 

html <- '<tr BGCOLOR = "#F8C0E0"> 
<td> BASOPHILS <td> microl  <td> 0.477 <td> 0.425 <td align="center"> 0.052 <td align="center"> 1.920 <td align="center"> 51.5 <td align="center"> 32 
</tr> 
<tr BGCOLOR = "#F8F0B0"> 
<td> CALCIUM <td > mg/dl  <td> 12.2 <td> 1.7 <td align="center"> 7.6 <td align="center"> 14.9 <td align="center"> 71 <td align="center"> 33 
</tr>' 

parsed_df <- html %>% 
    read_html() %>% 
    html_nodes('tr') %>% 
    map_df(~bind_cols(data_frame(bgcolor = html_attr(.x, 'bgcolor')), # grab attribute 
         # extract each row's values to 1-row data.frame 
         html_nodes(.x, 'td') %>% 
          html_text(trim = TRUE) %>% 
          set_names(paste0('x', seq_along(.))) %>% # or `%>% t() %>% as_data_frame()` 
          invoke(data_frame, .))) %>% 
    type_convert() # clean up types 

parsed_df 
#> # A tibble: 2 x 9 
#> bgcolor  x1  x2  x3 x4 x5 x6 x7 x8 
#>  <chr>  <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#> 1 #F8C0E0 BASOPHILS microl 0.477 0.425 0.052 1.92 51.5 32 
#> 2 #F8F0B0 CALCIUM mg/dl 12.200 1.700 7.600 14.90 71.0 33 

詳細html_tableの結果に:

paste('<table>', html, '</table>') %>% # `html_table` needs a <table> tag 
    read_html() %>% 
    { 
     data.frame(bgcolor = html_nodes(., 'tr') %>% html_attr('bgcolor'), 
        html_table(.)) 
    } 
#> bgcolor  X1  X2  X3 X4 X5 X6 X7 X8 
#> 1 #F8C0E0 BASOPHILS microl 0.477 0.425 0.052 1.92 51.5 32 
#> 2 #F8F0B0 CALCIUM mg/dl 12.200 1.700 7.600 14.90 71.0 33 
+1

すごいです!私は2番目の、より簡単な方法を使用し、それは魅力のように働いた。しかし、html_table()関数でheader = FALSEを設定しなければなりませんでした。ありがとうございました! – cricketbird

関連する問題