Вопрос по 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   ответа
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

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

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

Manager:Colleen Barros

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:                                       Â

Error: User Rate Limit Exceededhttr Вот:http://cran.r-project.org/web/packages/httr/index.html

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

Error: User Rate Limit ExceededError 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
Error: User Rate Limit Exceededssl.verifypeer = FALSEError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded userJT
Error: User Rate Limit Exceededssl.verifypeer = FALSEError: User Rate Limit Exceeded

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