2016-08-08 6 views
3

通常read_htmlコマンドを使用してhtmlテーブルをスクラップするのに問題はありませんが、特定のWebサイトで問題が発生しています。どんな助けでも大歓迎です。私のワークフローは以下の通りです:R's rvestパッケージとRSeleniumを使用したWebスクラブ

#Dependencies 
library(rvest) 
library(pipeR) 

#Scrape table from site 
url2 <- "http://priceonomics.com/hotels/rankings/#airbnb-apartments-all" 
data2 <- url2 %>% 
    read_html() %>% 
    html_nodes(xpath='//*[@id="airbnb-apartments-all"]/table') %>% 
    html_table(fill = TRUE) 
data2<-data2[[1]] 

最終的には、正しい見出しは付いていますが、データはありません。私はそのサイトの2番目のテーブルを掻きたい。

data2 
[1] Rank City $   
<0 rows> (or 0-length row.names) 

xpathを識別するためにGoogle Chromeを使用しました。私はまた、次のことを試してみた:

生成
readHTMLTable(url2) 

$`NULL` 
NULL 

$`NULL` 
NULL 

$`NULL` 
NULL 

は最後に、ウェブサイトは、Javaを使用している場合には、私はRのRSeleniumパッケージを使用してみましたが、私は接続できないようですサーバーに正しく:

library(RSelenium) 
checkForServer() 
startServer() 
remDr <- remoteDriver(browserName="firefox", port=4444) 
remDr$open(silent=T) 
Undefined error in RCurl call.Error in queryRD(paste0(serverURL, "/session"), "POST", qdata = toJSON(serverOpts)) : 
+0

私は助言したいと思います...データを破壊的に割り当てるのではなく、別の名前を割り当てることです。 'data%read_html()' –

+0

ありがとうございましたか、それとも私が従うかわかりませんが、単に "data2"の名前を変更することをお勧めしますか? –

+1

破壊的な割り当てを行うと、中間結果を振り返ることはできません。 –

答えて

1

すべてのデータがJSONファイルに返されます。あなたはおそらくそれでテーブルを構築することができます。たとえば、最初の表:

library(jsonlite) 
library(data.table) 
appData <- fromJSON("http://priceonomics.com/static/js/hotels/all_data.json") 
# replicate table 
myDf <- data.frame(City = names(appData), Price = sapply(appData, function(x) x$air$apt$p) 
        , stringsAsFactors = FALSE) 
setDT(myDf) 
> myDf[order(Price, decreasing = TRUE)][1:10] 
City Price 
1:  Boston, MA 185.0 
2:  New York, NY 180.0 
3: San Francisco, CA 165.0 
4:  Cambridge, MA 155.0 
5: Scottsdale, AZ 142.5 
6:  Charlotte, NC 139.5 
7: Charleston, SC 139.5 
8:  Las Vegas, NV 135.0 
9:   Miami, FL 135.0 
10:  Chicago, IL 130.0 
+0

素晴らしい、ありがとう! –

1

@jdharrisonの応答に感謝します。私は最終的にセレンのアプローチにも成功しました。私のワークフローは以下の通りです:

#Load dependencies 
devtools::install_github("ropensci/RSelenium", force=T) 
library(RSelenium) 

#Access Chrome driver 
checkForServer(update=T) 
startServer(javaargs="https://stackoverflow.com/users/name/folder/chromedriver") #path to where chromedriver is located on local hard (downloaded from: https://sites.google.com/a/chromium.org/chromedriver/downloads) 
remDr <- remoteDriver(browserName = "chrome") 
remDr$open() 

#Navigate to url, read, and sparse html table into dataframe 
remDr$navigate("http://priceonomics.com/hotels/rankings/#airbnb-apartments-all") 
doc <- htmlParse(remDr$getPageSource()[[1]]) 
doc<-readHTMLTable(doc) 
data2<-doc[[2]] 
関連する問題