关于如何使用XML包中的readHTMLTable,我有很好的答案,我使用常规的http页面,但是我无法通过https页面解决我的问题。
我正在尝试阅读本网站上的表格(网址字符串):
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问题(下面的前两行)(使用谷歌找到解决方案(例如: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 ...
答案 0 :(得分:26)
新软件包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
答案 1 :(得分:4)
使用Andrie超越https的好方法
在没有readHTMLTable的情况下获取数据的方法也在下面。
HTML中的表格可能包含ID。在这种情况下,表有一个很好的表,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经理:Colleen Barros
答案 2 :(得分: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)
}