Как перехватывать защищенные страницы в 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://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 ...

Ответ 1

Новый пакет 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:                 [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:                                       Â

Получить httr здесь: http://cran.r-project.org/web/packages/httr/index.html


EDIT: Полезная страница с часто задаваемыми вопросами о пакете RCurl: http://www.omegahat.org/RCurl/FAQ.html

Ответ 2

Использование Andrie отличный способ преодолеть https

можно также получить доступ к данным без 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

Мне еще нужно извлечь идентификаторы за гиперссылками.

например, вместо collen baros в качестве менеджера, мне нужно перейти к ID 0010080638

Руководитель: Коллин Баррос

Ответ 3

Это функция, с которой мне приходится иметь дело с этой проблемой. Обнаруживает 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)
}