xml - scraping - selectorgadget firefox
¿Cómo realizar un rastreo web de páginas seguras en R(enlaces https)(utilizando readHTMLTable del paquete XML)? (3)
El nuevo paquete httr
proporciona un envoltorio alrededor de RCurl
para que sea más fácil raspar todo tipo de páginas.
Aún así, esta página me dio una buena cantidad de problemas. Lo siguiente funciona, pero sin duda hay formas más fáciles de hacerlo.
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(''.*(<table class="grid".*?>.*</table>).*'', ''//1'', x)
# Parse the table
readHTMLTable(tab)
Los resultados:
$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: Â
Obtenga httr
aquí: http://cran.r-project.org/web/packages/httr/index.html
EDITAR: Página útil con preguntas frecuentes sobre el paquete RCurl
: http://www.omegahat.org/RCurl/FAQ.html
Hay buenas respuestas en SO sobre cómo usar readHTMLTable del paquete XML y lo hice con páginas http normales, sin embargo no puedo resolver mi problema con las páginas https.
Estoy tratando de leer la tabla en este sitio web (cadena url):
library(RTidyHTML)
library(XML)
url <- "https://ned.nih.gov/search/ViewDetails.aspx?NIHID=0010121048"
h = htmlParse(url)
tables <- readHTMLTable(url)
Pero recibo este error: el archivo https://ned.nih.gov/search/Vi...does no existe.
Traté de superar el problema de https con esto (primeras 2 líneas a continuación) (por usar google para encontrar una solución (como aquí: http://tonybreyal.wordpress.com/2012/01/13/r-a-quick-scrape-of-top-grossing-films-from-boxofficemojo-com/ ).
Este truco ayuda a ver más de la página, pero cualquier intento de extraer la tabla no está funcionando. Cualquier consejo apreciado. Necesito los campos de la tabla como Organización, Título de organización, Administrador.
#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<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/" /"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">/n<html xmlns=/"http://www.w3.org/1999/xhtml/" xml:lang=/"en/" lang=/"en/">/n<head>/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 ...
Esta es la función que tengo para lidiar con este problema. Detecta si https en url y usa httr si es.
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)
}
Usando la gran forma de Andrie de superar los https
una forma de obtener los datos sin readHTMLTable también se encuentra a continuación.
Una tabla en HTML puede tener una identificación. En este caso, la tabla tiene una buena y la función XPath en getNodeSet lo hace muy bien.
# 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
Todavía necesito extraer las IDs detrás de los hipervínculos.
por ejemplo, en lugar de Collen Baros como gerente, necesito obtener la ID 0010080638
Gerente: Colleen Barros