Вопрос по r, xml – Как создать защищенные страницы в R (ссылки https) (используя readHTMLTable из пакета XML)?

18

На 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 ...

Ваш Ответ

3   ответа
24

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.htm

РЕДАКТИРОВАТЬ Полезная страница с FAQ оRCurl пакет:http: //www.omegahat.org/RCurl/FAQ.htm

Очень хорошее решение и отличное использование нового httr. Мне было очень любопытно, как этот будет решен. Многие правительственные файлы находятся на веб-сайтах https, поэтому исследователь в области образования благодарит вас :) + 1 Tyler Rinker
@ TylerRinker Спасибо. Я попробовал свой код в чистом сеансе, и он не работал. Модификация размещена. Это работает в чистой сессии на моей машине. (Изменить, чтобы включитьssl.verifypeer = FALSE в конфиге.) Andrie
Можете ли вы отредактировать пост, чтобы удалитьssl.verifypeer = FALSE - это действительно плохая практика безопасности, и в этом нет необходимости. (Вам также не нужно устанавливать путь к сертификату, httr сделает это за вас) hadley
я получаю следующую ошибку с вашим кодомError in function (type, msg, asError = TRUE) : SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed Tyler Rinker
Есть ли способ получить информацию о ссылке, скрытую в ссылке HREF. например, вместо Коллена Бароса в качестве менеджера, я мог бы также знать идентификатор менеджера 0010080638: </ td> <td> <a target="_new" href="viewdetails.aspx?NIHID=0010080638" class="DVLink"> Colleen Баррос </a> </ TD> userJT
0

с которой я должен справиться. Определяет, если 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)
}
4

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

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

Например, вместо Коллен Барос, как менеджер, мне нужно получить идентификатор 0010080638

Менеджер: Коллин Баррос

Похожие вопросы