2016-06-22 3 views
3

私は分析の有名人/著名な死者に関するデータを抽出しようとしています。ウィキペディアは、著しい死の日々に関するhtmlパスに非常に規則的な構造を持っています。それは次のようになります。たとえばルーピングでWikipediaのデータをR

https://en.wikipedia.org/wiki/Deaths_in_"MONTH"_"YEAR" 

、このリンクは、私は「」#mwを私はする必要がリストのCSSの場所に位置している月の顕著な死亡、2014

https://en.wikipedia.org/wiki/Deaths_in_March_2014 

につながります-content-text h3 + ul li "を探し、特定のリンクのためにそれを抜き出しました。今、私は選択した月と何年もの間、ループを作成しようとしています。 2015年にテストするときにエラーが発生する。

library(rvest) 
data = data.frame() 
mlist = c("January","February","March","April","May","June","July","August", 
       "September","October","November","December") 

for (y in 2015:2015){ 
    for (m in 1:12){ 
    site = read_html(paste("https://en.wikipedia.org/wiki/Deaths_in_",mlist[m], 
      "_",y,collapse="")) 
    fnames = html_nodes(site,"#mw-content-text h3+ ul li") 
    text = html_text(fnames) 
    data = rbind(data,text,stringsAsFactors=FALSE) 
     } 
} 
それは明確に、このビットに関連していますので、エラーが返されません

data = rbind(data,text,stringsAsFactors=FALSE) 

私は行をコメントアウトするとき。私は他のコメントのために私の全体のコードを投稿しています。ここでの目標は何年ものループを繰り返し、その後数年間と数ヶ月にわたる流通に焦点を当てることです。このためには、年齢、月、および年を守るだけです。

ありがとうございました!

編集:申し訳ありませんが、技術的には警告でエラーではありません。私はそれらの50以上を取得し、私は "データ"を見てみると、それは巨大な混乱です。

特定のURLのループとしてではなく、このコードを実行すると、正常に動作し、読み取り可能な出力が返されます。ここで

site = read_html("https://en.wikipedia.org/wiki/Deaths_in_January_2015") 
fnames = html_nodes(site,"#mw-content-text h3+ ul li") 
text = html_text(fnames) 

は、そのデータ・セットからの行のカップルです:

text[1:5] 
[1] "Barbara Atkinson, 88, British actress (Z-Cars).[1]"           
[2] "Staryl C. Austin, 94, American air force brigadier general.[2]"        
[3] "Ulrich Beck, 70, German sociologist, heart attack.[3]"          
[4] "Fiona Cumming, 77, British television director (Doctor Who).[4]"        
[5] "Eric Cunningham, 65, Canadian politician, Ontario MPP for Wentworth North (1975–1984).[5]" 
+0

エラーメッセージは表示されませんでした。どのようなエラーがありましたか?どのような出力データセットはどのように見えますか? –

+0

あなたのエラーを容易に再現できるように、使用しているパッケージの名前を投稿してください。 – abhiieor

+2

私はこのテンプレートと私が使っているライブラリのrvestを使って成功したスクレイプの例を含めるように投稿を編集しました。 – user137698

答えて

1

html_text(fnames)は配列を返します。あなたの問題は、配列をデータフレームに追加しようとしています。
は、追加する前に、データフレームにあなたの変数textを変換してみてください。

for (y in 2015:2015){ 
    for (m in 1:12){ 
    site = read_html(paste("https://en.wikipedia.org/wiki/Deaths_in_",mlist[m], 
      "_",y,collapse="")) 
    fnames = html_nodes(site,"#mw-content-text h3+ ul li") 
    text = html_text(fnames) 

    temp<-data.frame(text, stringsAsFactors = FALSE) 

    data = rbind(data,temp) 
    } 
} 

これは、パフォーマンス上の理由のための最高の技術ではありません。ループを通過するたびに、パフォーマンスを低下させるデータフレームのメモリが再割り当てされます。これは、これが1回限りのイベントであり、この場合は管理可能な要求の数が制限されています。

+0

転記して以来、rbindが "text"の構造のために問題を引き起こしていたことがわかりました。私は「行列として」変換を使用していましたが、それは6kレベルの係数を持つデータフレームを作成しました。あなたのコードはこの問題を取り除きます! – user137698

1

私はあなたが得た同じエラーを取得することができませんでしたが、私はあなたが何をしたいのかを知っていると思います。

私はこれが毎月の死者数の不平等と関係があると感じています。

私は、これは、各月の死亡者のための文字のリストを作成

mlist = c("January","February","March","April","May","June","July","August", 
     "September","October","November","December") 

for (y in 2015:2015){ 
    for (m in 1:12){ 
    site = read_html(paste("https://en.wikipedia.org/wiki/Deaths_in_",mlist[m], 
         "_",y,collapse="")) 
    fnames = html_nodes(site,"#mw-content-text h3+ ul li") 
    text = html_text(fnames) 
    assign(mlist[m],text) 
    } 
} 

このようにそれをやってお勧めしたいです。

代替(簡単に使用するために、後でそれらを結合するために、ループ内の)リストを使用することです:

個人的に
data = vector("list",12) 
mlist = c("January","February","March","April","May","June","July","August", 
     "September","October","November","December") 

for (y in 2015:2015){ 
    for (m in 1:12){ 
    site = read_html(paste("https://en.wikipedia.org/wiki/Deaths_in_",mlist[m], 
         "_",y,collapse="")) 
    fnames = html_nodes(site,"#mw-content-text h3+ ul li") 
    text = html_text(fnames) 
    data[[m]] = text 
    } 
} 

、私はR.でリストを扱う好きではない。しかし、これはあると思われます最高の回避策。

+0

面白い、ありがとう!最終的にはyを複数年にわたるループに変更したいので、行を追加できるようにこれを調整する必要がありますが、これはエラーなしで実行されます。 – user137698