2016-05-15 118 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)。请分享您的代码。 –