2015-02-25 13 views
10

Ten artykuł http://www.ajnr.org/content/30/7/1402.full zawiera cztery linki do tabel HTML, które chciałbym skrobać z rvest.scrape wielu połączonych tabel HTML w R i rvest

Z pomocą selektora CSS:

"#T1 a" 

to możliwe, aby dostać się do pierwszej tabeli tak:

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

CSS-selektor:

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

czyni go można wybrać wszystkie cztery html-węzły zawierające znaczniki łączące się z czterema tabelami:

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

Jak można przełączyć tę listę i pobrać wszystkie cztery tabele za jednym razem? Jakie jest najlepsze podejście?

+0

może to pomaga się http://stackoverflow.com/questions/1395528/scraping-html- tabele-do-danych-ramek-przy użyciu-pakietu-xml –

Odpowiedz

15

Oto jeden sposób:

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

Świetnie. Tego właśnie szukałem i dzięki za rvest. – landge

+0

Próbowałem tego i otrzymałem komunikat o błędzie: Komunikat ostrzegawczy: "html" jest przestarzałe. Zamiast tego użyj "read_html". Zobacz pomoc ("Przestarzałe") –

+0

Zmieniłem to, zastępując read_html (url) w trzecim wierszu. Nadal dostaję skargi. Co ja robię źle? –

1

Możesz chcieć użyć w następujący sposób:

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

Dziękujemy! Czy byłoby możliwe stworzenie bardziej ogólnego podejścia, w którym skrypt wyodrębnia liczbę tabel (lub łączy)? To może być następnie wykorzystane do innych artykułów tego samego dziennika, jak również. – landge