2017-04-13 3 views
2

私は公共の医療データでは、次のウェブサイトをこすりしようとしています: https://prog.nfz.gov.pl/app-jgp/Grupa.aspx?id=Qpc6nYOpOBQ%3drvest:特定した後、(S)(タイトル)をHTMLテーブルを選択し、こすり文字列

私は、テーブルやテーブルこすりしたいと思います 「Tabela xx procedury ICD-9」というタイトルが付いています。ここで、xxは固定数ではありません。

1つではありますが、場合によっては2つのテーブルがページに存在することがあります。そして、他のページとは異なる順序で出現する可能性があるので、n番目のページをウェブサイトに表示することはできません。

たとえば、「Icd-9 main」という文字列が前に付いている同じページのテーブルだけに興味があり、他のものはスキップします。このようなテーブルが2つあり、その内容をdata.frameにスクラップしたいと思います。次のような順序では表示されない場合がありますので、先行の文字列に頼らなければなりません。場合によっては、Icd-9メインテーブルがまったく存在しないことがあります。

Page 
---- 
Icd-10 
==== 
Table 
==== 

Icd-9 main 
==== 
Table 
=== 

Icd-9 main 
==== 
Table 
==== 


Icd-9 supplementary 
==== 
Table 
=== 

私はこのチュートリアルのような順序でn番目のテーブルを選択するコードだけを認識しています:すべてのテーブルがリストにダンプさせる

https://www.r-bloggers.com/using-rvest-to-scrape-an-html-table/

library("rvest") 
url <- "http://en.wikipedia.org/wiki/List_of_U.S._states_and_territories_by_population" 
population <- url %>% 
    html() %>% 
    html_nodes(xpath='//*[@id="mw-content-text"]/table[1]') %>% 
    html_table() 
population <- population[[1]] 

し、我々番号で希望のテーブルを選択することができます

私の場合、私は決してどのテーブルが掻き集められるかはわかりません。順序は異なるかもしれません。 "Tabela xx:procedury ICD-9"を含むtring

私の質問は、タイトルまたは記述文字列を前提にしてhtmlテーブルを選択してスクレープする方法です。または、例えば「Tabela xx procedury ICD-9」を含む文字列の直後にのみ現れるテーブルまたは表表

答えて

2
library(rvest) 
library(stringr) 

doc <- read_html("https://prog.nfz.gov.pl/app-jgp/Grupa.aspx?id=Qpc6nYOpOBQ%3d") 

# extract all the nodes that have the title (id = "tytul") or a table 
# the cs selector "," is like a boolean OR. 
nodes <- doc %>% html_nodes(".tytul,table") 

# loop though each node. 
signal <- FALSE 
my_tables <- list() 
j <- 0 
for (i in 1:length(nodes)) { 

    # if title signal previously set and this is a table tag 
    if (signal & html_name(nodes[i]) == "table") { 
    cat("Match..\n") 

    # get the table (data frame) 
    this_table <- html_table(nodes[i], fill = TRUE, header = TRUE)[[1]] 

    # append to list 
    j = j + 1 
    my_tables[[j]] <- this_table 

    # and reset the signal so we search for the next one 
    signal <- FALSE 
    } 

    # if the signal is clear look for matching title 
    if (!signal) { 
    signal <- nodes[i] %>% html_text() %>% str_detect("Tabela.+ICD 9") 
    } 
} 
my_tables[[1]][1:5,] 
my_tables[[2]][1:5,] 

# > my_tables[[1]][1:5,] 
# ICD 9             Nazwa Lb. hospitalizacji UdziaĹ\u0082 (%) Mediana czasu pobytu (dni) 
# 1 2.051  ZaĹ\u0082oĹźenie pĹ\u0082ytki sztucznej do czaszki    168   32,31       7 
# 2 1.247 Kraniotomia z usuniÄ\u0099ciem krwiaka podtwardĂłwkowego     55   10,58       20 
# 3 2.022      Odbarczenie zĹ\u0082amania czaszki     43    8,27       6 
# 4 2.040     Przeszczep kostny do koĹ\u009bci czaszki     35    6,73       8 
# 5 1.093      Inne aspiracje w zakresie czaszki     33    6,35       5 
# > my_tables[[2]][1:5,] 
# ICD 9           Nazwa Lb. hospitalizacji UdziaĹ\u0082 (%) Mediana czasu pobytu (dni) 
# 1 O35          SĂłd (Na)    239   45,96       8 
# 2 89.00   Porada lekarska, konsultacja, asysta    230   44,23       9 
# 3 N45          Potas (K)    217   41,73       8 
# 4 87.030     TK gĹ\u0082owy bez kontrastu    214   41,15       9 
# 5 89.04 Opieka pielÄ\u0099gniarki lub poĹ\u0082oĹźnej    202   38,85       8 
+0

これは素晴らしいepi99です。ファビュラス!神はあなたを祝福し、あなたは私をたくさん助け、私を始めてください。どうやってそれを学んだのですか?あなたは良い情報源を推薦できますか? –

+0

@JacekKotowski、これは主に基本的な手続き型プログラミング(ループとスイッチであり、Rの良いスタイルではない)です。これはテキストやクラスでJavaのプログラミングに入門するために教えられます。 Webのスクレイピングについては、html(DOM)の構造を理解し、CSS.selectorsについて学ぶことが役に立ちます。 )ブラウザの "inspect elements"を使って、Webページの構造を理解してください。 R側では、私はHadley Wickhamのパッケージ "hadleyverse"に多くの注意を払った – epi99

関連する問題