2016-05-15 145 views
1

我是一個新的學習者R,我有興趣使用rvest提取html表格並提交html表單。使用rvest提取html表格

現在,我想從中文網站獲取一些有用的信息。網址是:

http://caipiao.163.com/award/cqssc/20160513.html

我使用Windows 10 Professional,帶RStudio版本0.99.896,我使用谷歌瀏覽器使用XPath助手插件的Web瀏覽器。

我想從中文網站中提取主html表格,它包含120組關於彩票中獎號碼的信息。第一個(001)是:98446,最後一個(120)是:01798;我只想提取數字(001)至(120)和中獎號碼:98446至01798.

我使用XPATH幫助器和Chrome Web開發來獲取XPATH。

我覺得我想要的信息的XPATH是:

//html/body/article[@class='docBody clearfix']/section[@id='mainArea']/div[@class='lottery-results']/table[@class='awardList']/*[@id="mainArea"]/div[1]/table/tbody/tr[2]/td[1] 

但是當我運行在RStudio下面的代碼,我無法得到我想要的結果。 以下是我的代碼:

> library(rvest) 
Loading required package: xml2 
> url <- "http://caipiao.163.com/award/cqssc/20160513.html" 
> xp <- "//html/body/article[@class='docBody clearfix']/section [@id='mainArea']/div[@class='lottery-results']/table[@class='awardList']/*[@id='mainArea']/div[1]/table/tbody/tr[2]/td[1]" 
> 
> x <- read_html(url) 
> y <- x %>% html_nodes(xpath=xp) 
> y 
{xml_nodeset (0)} 

> 

請看看我的代碼,讓我知道,如果我犯任何錯誤。你可以簡單地忽略那些不知名的漢字,它們並不重要,我只是想得到這些數字。

謝謝! 約翰

回答

0

我會使用功能readHTMLTable從包XML得到整個表格,在您的網站只有一個<table>元素:

install.packages("XML) 
library(XML) 
url <- "http://caipiao.163.com/award/cqssc/20160513.html" 
lotteryResults <- as.data.frame(readHTMLTable(url)) 

然後,你可以做一些清潔程序,子集和使用rbind獲得一個data.frame,包含2列和120個觀察值。

+0

您是否運行過該代碼?我不確定OP是否意識到JS中有一些後續處理可以使連續的# – hrbrmstr

+1

你好,非常感謝你,你的解決方案似乎比較好。但是,我的R級別還不夠好,我可以看到結果,例如:1 001 9 8 4 4 6 ...但是我如何提取'001'和'9 8 4 4 6'並擺脫其他無用信息? –

1

因爲只有一個table元素(如另一個回答者也指出的那樣),所以沒有必要使用這種精確的目標選擇器。但你並不需要離開rvest背後:

library(rvest) 

URL <- "http://caipiao.163.com/award/cqssc/20160513.html" 

pg <- read_html(URL) 
tab <- html_table(pg, fill=TRUE)[[1]] 

str(tab) 

## 'data.frame': 40 obs. of 39 variables: 
## $ 期號 : int 1 2 3 4 5 6 7 8 9 10 ... 
## $ 開獎號碼: chr "9 8 4 4 6" "1 8 3 1 6" "2 9 3 5 6" "1 4 5 8 0" ... 
## .... 

(SO被解釋部分的unicode字形爲垃圾郵件,所以我不得不刪除其他列)。

第二列是通過頁面後加載的javascript操作來壓縮的,所以如果這是你要做的,你需要清理一下。

+1

你好,在我的Windows 10中,我可以看到你的代碼的結果看起來像垃圾代碼,但你的結果似乎是可讀的中文。我想知道如何獲得這一行(str(tab)結果中的第三個):## $開獎號碼:chr「9 8 4 4 6」「1 8 3 1 6」「2 9 3 5 6」 「1 4 5 8 0」... 如果可能,如何將它們保存到SQL Server數據表中,我想保存3個信息:日期:20160513(對於所有120條記錄都是一樣的),訂單號碼:1到120,以及開獎號碼「98446」 ; 「18316」; 「29356」; 「14580」...每個抽獎號碼對應一個訂單號(1至120)。請分享您的代碼。 –