Как создать защищенные страницы в R (ссылки https) (используя readHTMLTable из пакета XML)?
На SO есть хорошие ответы о том, как использовать readHTMLTable из пакета XML, и я сделал это с обычными http-страницами, однако я не могу решить мою проблему со страницами https.
Я пытаюсь прочитать таблицу на этом сайте (строка URL):
library(RTidyHTML)
library(XML)
url <- "https://ned.nih.gov/search/ViewDetails.aspx?NIHID=0010121048"
h = htmlParse(url)
tables <- readHTMLTable(url)
Но я получаю эту ошибку: Файл https: https://ned.nih.gov/search/Vi...does не существует.
Я попытался обойти проблему https (первые 2 строки ниже)(с помощью Google, чтобы найти решение (как здесь: http://tonybreyal.wordpress.com/2012/01/13/r-a-quick-scrape-of-top-grossing-films-from-boxofficemojo-com/).
Этот трюк помогает увидеть больше страницы, но любые попытки извлечь таблицу не работают. Любой совет приветствуется. Мне нужны поля таблицы, такие как Организация, Название организации, Менеджер.
#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 ...
3 ответа
Новый пакет httr
обеспечивает обертку вокруг RCurl
чтобы было легче очищать все виды страниц.
Тем не менее, эта страница доставила мне немало хлопот. Следующие работы, но без сомнения, есть более простые способы сделать это.
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)
Результаты, достижения:
$ctl00_ContentPlaceHolder_dvPerson
V1 V2
1 Legal Name: Dr Francis S Collins
2 Preferred Name: Dr Francis Collins
3 E-mail: francis.collins@nih.gov
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: Â
Получить httr
здесь: http://cran.r-project.org/web/packages/httr/index.html
РЕДАКТИРОВАТЬ: Полезная страница с часто задаваемыми вопросами о RCurl
пакет: http://www.omegahat.org/RCurl/FAQ.html
Используя Андрие отличный способ пройти через htt ps
способ получить данные без readHTMLTable также ниже.
Таблица в HTML может иметь идентификатор. В этом случае у таблицы есть один хороший, и XPath в функции getNodeSet делает это хорошо.
# 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
Мне все еще нужно извлечь идентификаторы за гиперссылками.
например, вместо Коллен Барос в качестве менеджера, мне нужно добраться до ID 0010080638
Менеджер: Коллин Баррос
Это функция, которую я должен решить с этой проблемой. Определяет, если https в URL и использует httr, если это так.
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)
}