2017-05-27 17 views
0

a websiteからRを使用してデータを削り取ろうとしています。rvestを使用して、an example scraping the IMDB page for the Lego Movieを模倣しようとしています。この例では、Selector Gadgetというツールを使用して、取得しようとしているデータに関連付けられているhtml_nodeを簡単に識別できるようサポートしています。 rankblog_namefacebook_fanstwitter_followersalexa_rankRとセレクタガジェットを使ったWebスクレイピング

は、私は次のスキーマ/列を持つデータフレームを構築する上で、最終的に興味があります。

以下のマイコード。レゴの例で使用されているhtmlタグを正しく識別するためにセレクタガジェットを使用することができました。しかし、レゴの例と同じプロセスと同じコード構造に従って、私はNAs(...using firstNAs introduced by coercion[1] NA )を取得します。 、それは714試合をレポートするので、「Facebookのファン」欄のために働くようだhtml_node("html_node(".stats , .stats span"))、しかし、唯一の1つの数が返される返します

data2_html = read_html("http://blog.feedspot.com/video_game_news/") 
data2_html %>% 
    html_node(".stats") %>% 
    html_text() %>% 
    as.numeric() 

私はまたして実験している:私のコードは以下の通りです。

714 matches for .//*[@class and contains(concat(' ', normalize-space(@class), ' '), ' stats ')] | .//*[@class and contains(concat(' ', normalize-space(@class), ' '), ' stats ')]/descendant-or-self::*/span: using first{xml_node} 
<td> 
[1] <span>997,669</span> 

答えて

2

これはあなたを助けることがあります。

library(rvest) 

d1 <- read_html("http://blog.feedspot.com/video_game_news/") 

stats <- d1 %>% 
    html_nodes(".stats") %>% 
    html_text() 

blogname <- d1%>% 
    html_nodes(".tlink") %>% 
    html_text() 

注それはhtml_nodes(複数)

結果であること:

簡単ですブログ名のリストを返します blogname
> head(blogname) 
[1] "Kotaku - The Gamer's Guide" "IGN | Video Games"   "Xbox Wire"     "Official PlayStation Blog" 
[5] "Nintendo Life "    "Game Informer" 

> head(stats,12) 
[1] "997,669" "1,209,029" "873"  "4,070,476" "4,493,805" "399"  "23,141,452" "10,210,993" "879"  
[10] "38,019,811" "12,059,607" "500" 

管理する。一方、統計情報は混在しています。これは、FacebookとTwitterファンのためのクラスstatsのクラスが互いに区別できないためです。この場合、出力配列は3つの数値、つまりstats = c(fb、tw、alx、fb、tw、alx ...)の情報を持ちます。それぞれのベクターをこのベクターから分離する必要があります。

FBstats = stats[seq(1,length(stats),3)] 

> head(stats[seq(1,length(stats),3)]) 
[1] "997,669" "4,070,476" "23,141,452" "38,019,811" "35,977"  "603,681" 
0

これは数字でコンマを除去するhtml_nodes(複数)とstr_replaceを使用します。これらがすべて必要な統計情報であるかどうかは不明です。

library(rvest) 
library(stringr) 
data2_html = read_html("http://blog.feedspot.com/video_game_news/") 
data2_html %>% 
    html_nodes(".stats") %>% 
    html_text() %>% 
    str_replace_all(',', '') %>% 
    as.numeric() 
1

あなたは、最小限の作業でテーブル全体を抽出するためにhtml_tableを使用することができます。

library(rvest) 
library(tidyverse) 

# scrape html 
h <- 'http://blog.feedspot.com/video_game_news/' %>% read_html() 

game_blogs <- h %>% 
    html_node('table') %>% # select enclosing table node 
    html_table() %>% # turn table into data.frame 
    set_names(make.names) %>% # make names syntactic 
    mutate(Blog.Name = sub('\\s?\\+.*', '', Blog.Name)) %>% # extract title from name info 
    mutate_at(3:5, parse_number) %>% # make numbers actually numbers 
    tbl_df() # for printing 

game_blogs 
#> # A tibble: 119 x 5 
#>  Rank     Blog.Name Facebook.Fans Twitter.Followers Alexa.Rank 
#> <int>      <chr>   <dbl>    <dbl>  <dbl> 
#> 1  1 Kotaku - The Gamer's Guide  997669   1209029  873 
#> 2  2   IGN | Video Games  4070476   4493805  399 
#> 3  3     Xbox Wire  23141452   10210993  879 
#> 4  4 Official PlayStation Blog  38019811   12059607  500 
#> 5  5    Nintendo Life   35977    95044  17727 
#> 6  6    Game Informer  603681   1770812  10057 
#> 7  7   Reddit | Gamers  1003705   430017   25 
#> 8  8     Polygon  623808   485827  1594 
#> 9  9 Xbox Live's Major Nelson   65905   993481  23114 
#> 10 10      VG247  397798   202084  3960 
#> # ... with 109 more rows 

それはあなたが望むようにすべてのものが解析されていることを確認する価値はありますが、それはこの時点で使用可能であるべきです。

+0

これは本当にクールに見えますが、私はあなたの結果を複製することができません。エラー: 'game_blogs <- h %>% html_node( 'table')%>%#囲みテーブルノードを選択 html_table()%>%#テーブルをdata.frameに変換 set_names(make.names) エラー:' x'と ' nmは同じ長さでなければならない ' – user2205916

+0

Ah!申し訳ありませんが、それは関数をとることができる 'purrr :: set_names'の開発版を使用しています。 [Github](https://github.com/tidyverse/purrr/)からインストールするか、同じことを行う 'set_names(make.names(names(。))')だけを使用してください。 – alistaire

関連する問題