19

XML パッケージから readHTMLTable を使用する方法について SO に良い回答があり、通常の http ページでそれを行いましたが、https ページで問題を解決できません。

この Web サイト (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...存在しません。

私はこれでhttpsの問題を乗り越えようとしました(以下の最初の2行)(Googleを使用して解決策を見つけることから(ここのように:http ://tonybreyal.wordpress.com/2012/01/13/ra-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 ...
4

3 に答える 3

28

新しいパッケージは、あらゆる種類のページのスクレイピングを容易にする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パッケージに関する FAQ を含む便利なページ: http://www.omegahat.org/RCurl/FAQ.html

于 2012-05-22T04:58:06.570 に答える
4

Andrie の優れた方法を使用して https を通過する

readHTMLTable を使用せずにデータを取得する方法も以下に示します。

HTML のテーブルには ID がある場合があります。この場合、テーブルには適切なテーブルが 1 つあり、getNodeSet 関数の XPath はそれを適切に処理します。

# 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 を抽出する必要があります。

たとえば、マネージャーとして collen baros の代わりに、ID 0010080638 にアクセスする必要があります。

マネージャー:コリーン・バロス

于 2012-05-22T17:57:06.730 に答える
0

これは、この問題に対処するために必要な機能です。URL に https があるかどうかを検出し、ある場合は 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)
}
于 2018-01-21T06:09:11.853 に答える