Как создать защищенные страницы в 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)
}
Другие вопросы по тегам