Come scansionare le pagine protette in R (link https) (usando readHTMLTable dal pacchetto XML)?

Ci sono buone risposte su SO su come usare readHTMLTable dal pacchetto XML e l’ho fatto con le normali pagine http, tuttavia non sono in grado di risolvere il mio problema con le pagine https.

Sto cercando di leggere la tabella su questo sito web (stringa di URL):

library(RTidyHTML) library(XML) url <- "https://ned.nih.gov/search/ViewDetails.aspx?NIHID=0010121048" h = htmlParse(url) tables <- readHTMLTable(url) 

Ma ottengo questo errore: il file https://ned.nih.gov/search/Vi…does non esiste.

Ho provato a superare il problema https con questo (prime 2 righe sotto) (dall’uso di google per trovare la soluzione (come qui: http://tonybreyal.wordpress.com/2012/01/13/ra-quick-scrape-of -top-incassare-film-da-boxofficemojo-com / ).

Questo trucco aiuta a vedere più pagine, ma qualsiasi tentativo di estrarre la tabella non funziona. Qualche consiglio apprezzato. Ho bisogno dei campi della tabella come Organizzazione, Titolo organizzativo, Manager.

  #attempt to get past the https problem raw <- getURL(url, followlocation = TRUE, cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")) head(raw) [1] "\r\n\n\n\n<meta http-equiv=\"Content-Type\" content=\"text/html; ... h = htmlParse(raw) Error in htmlParse(raw) : File ... tables <- readHTMLTable(raw) Error in htmlParse(doc) : File ... 

Il nuovo pacchetto httr fornisce un wrapper su RCurl per semplificare la RCurl di tutti i tipi di pagine.

Tuttavia, questa pagina mi ha dato una discreta quantità di problemi. I seguenti lavori, ma senza dubbio ci sono modi più semplici per farlo.

 library("httr") library("XML") # Define certicificate file cafile <- system.file("CurlSSL", "cacert.pem", package = "RCurl") # Read page page <- GET( "https://ned.nih.gov/", path="search/ViewDetails.aspx", query="NIHID=0010121048", config(cainfo = cafile) ) # Use regex to extract the desired table x <- text_content(page) tab <- sub('.*(.*
).*', '\\1', x) # Parse the table readHTMLTable(tab)

I risultati:

 $ctl00_ContentPlaceHolder_dvPerson V1 V2 1 Legal Name: Dr Francis S Collins 2 Preferred Name: Dr Francis Collins 3 E-mail: [email protected] 4 Location: BG 1 RM 1261 CENTER DRBETHESDA MD 20814 5 Mail Stop: Â 6 Phone: 301-496-2433 7 Fax: Â 8 IC: OD (Office of the Director) 9 Organization: Office of the Director (HNA) 10 Classification: Employee 11 TTY: Â 

Ottieni httr qui: http://cran.r-project.org/web/packages/httr/index.html


EDIT: pagina utile con FAQ sul pacchetto RCurl : http://www.omegahat.org/RCurl/FAQ.html

Usare Andrie è un ottimo modo per superare gli https

Di seguito è riportato anche un modo per ottenere i dati senza readHTMLTable.

Una tabella in HTML può avere un ID. In questo caso la tabella ne ha una bella e l’XPath nella funzione getNodeSet lo fa bene.

 # Define certicificate file cafile <- system.file("CurlSSL", "cacert.pem", package = "RCurl") # Read page page <- GET( "https://ned.nih.gov/", path="search/ViewDetails.aspx", query="NIHID=0010121048", config(cainfo = cafile, ssl.verifypeer = FALSE) ) h = htmlParse(page) ns <- getNodeSet(h, "//table[@id = 'ctl00_ContentPlaceHolder_dvPerson']") ns 

Devo ancora estrarre gli ID dietro i collegamenti ipertestuali.

per esempio invece di collen baros come manager, ho bisogno di ottenere l'ID 0010080638

Responsabile: Colleen Barros

Questa è la funzione che devo affrontare con questo problema. Rileva se https nell’url e usa httr se lo è.

 readHTMLTable2=function(url, which=NULL, ...){ require(httr) require(XML) if(str_detect(url,"https")){ page <- GET(url, user_agent("httr-soccer-ranking")) doc = htmlParse(text_content(page)) if(is.null(which)){ tmp=readHTMLTable(doc, ...) }else{ tableNodes = getNodeSet(doc, "//table") tab=tableNodes[[which]] tmp=readHTMLTable(tab, ...) } }else{ tmp=readHTMLTable(url, which=which, ...) } return(tmp) }