2015-02-25 24 views
10

Bu makale http://www.ajnr.org/content/30/7/1402.full numaralı makalede, html tablolarına, hasatla kazımak istediğiniz dört bağlantı içerir. css seçicinin yardımıylaR ve rasgele birden çok bağlantılı HTML tablolarını kazıyın

:

library("rvest") 
html_session("http://www.ajnr.org/content/30/7/1402.full") %>% 
follow_link(css="#T1 a") %>% 
html_table() %>% 
View() 

css-seçici:

".table-inline li:nth-child(1) a" 

yapar

"#T1 a" 

böyle birinci tabloya almak mümkündür dört tabloya bağlanan etiketleri içeren dört html düğümünü seçmek mümkün:

library("rvest") 
html("http://www.ajnr.org/content/30/7/1402.full") %>% 
html_nodes(css=".table-inline li:nth-child(1) a") 

Bu listeyi değiştirmek ve dört tabloyu tek seferde almak nasıl mümkün olabilir? En iyi yaklaşım nedir?

+0

belki bu size yardımcı oluyor http://stackoverflow.com/questions/1395528/scraping-html- tablo-r-veri-çerçeveler-kullanarak-xml paketi –

cevap

15

İşte bir yaklaşımdır:

library(rvest) 

url <- "http://www.ajnr.org/content/30/7/1402.full" 
page <- read_html(url) 

# First find all the urls 
table_urls <- page %>% 
    html_nodes(".table-inline li:nth-child(1) a") %>% 
    html_attr("href") %>% 
    xml2::url_absolute(url) 

# Then loop over the urls, downloading & extracting the table 
lapply(table_urls, . %>% read_html() %>% html_table()) 
+0

Harika. Aradığım şey budur ve hasat için teşekkürler. – landge

+0

Bunu denedim ve bir hata mesajım var: Uyarı iletisi: 'html' kullanımdan kaldırıldı. Bunun yerine 'read_html' kullanın. Bkz. Yardım ("Kullanımdan Kaldırıldı") –

+0

Bunu üçüncü satırdaki read_html (url) kullanarak değiştirdim. Hala şikayet alıyorum. Neyi yanlış yapıyorum? –

1

aşağıdaki şekilde kullanmak isteyebilirsiniz:

main_url <- "http://www.ajnr.org/content/30/7/1402/" 
urls <- paste(main_url,c("T1.expansion","T2.expansion","T3.expansion","T4.expansion"),".html", sep = "") 
tables <- list() 
for(i in seq_along(urls)) 
{ 
    total <- readHTMLTable(urls[i]) 
    n.rows <- unlist(lapply(total, function(t) dim(t)[1])) 
    tables[[i]] <- as.data.frame(total[[which.max(n.rows)]]) 
} 
tables 

#[[1]] 
# Glioma Grade Sensitivity Specificity PPV NPV 
#1 II vs III  50.0%  92.9% 80.0% 76.5% 
#2  II vs IV  100.0%  100.0% 100.0% 100.0% 
#3 III vs IV  78.9%  87.5% 93.8% 63.6% 

#[[2]] 
# Glioma Grade Sensitivity Specificity PPV NPV 
#1 II vs III  87.5%  71.4% 63.6% 90.9% 
#2  II vs IV  100.0%  85.7% 90.5% 100.0% 
#3 III vs IV  89.5%  75.0% 89.5% 75.0% 

#[[3]] 
# Criterion Sensitivity Specificity PPV NPV 
#1  ≥1*  85.2%  92.9% 95.8% 76.5% 
#2  ≥2  81.5%  100.0% 100.0% 73.7% 

#[[4]] 
# Criterion Sensitivity Specificity PPV NPV 
#1  <1.92  96.3%  71.4% 86.7% 90.9% 
#2  <2.02  92.6%  71.4% 86.2% 83.3% 
#3 <2.12*  92.6%  85.7% 92.6% 85.7% 
+0

Teşekkür ederim! Komut dosyası, tabloların (veya bağlantıların) sayısını çıkardığında daha genel bir yaklaşım oluşturmak mümkün olabilir mi? Bu, aynı derginin diğer makaleleri için de kullanılabilir. – landge

İlgili konular