将混乱的数据写入R

时间:2016-06-09 07:23:46

标签: r web-scraping rvest

我正在努力抓取一个特定网站的某个部分,这个网站看起来像一张桌子,但不是(不幸的)。

我使用此代码......

htmldoc <- read_html("http://www.wettportal.com/quotenvergleich/valuebets/")

data <- htmldoc %>% 
  html_node(xpath='//*[(@id = "datagrid_content")]') %>%
  html_text()

# alternative css selector: "#datagrid_content"

..并得到这种输出:

Fussball | Schweden | Cup\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n08.06.2016\r\nTipp\r\nVQ\r\nBuchmacher\r\n100%\r\nProfit\r\n\r\n\r\n\r\n\r\n19:00\r\nHuddinge IF - Enskede IK\r\n1 (DNB)\r\n1.73\r\nCoral\r\n1.50\r\n45.17%\r\n\r\n\r\n19:00\r\nHuddinge IF - Enskede IK\r\n1\r\n2.25\r\nCoral\r\n1.93\r\n35.00%\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

正如你所看到的,它真的很混乱,到目前为止我还没能把它整齐地放到data.frame中。

任何人都知道如何

  • 以不同的方式选择对象以便从一开始就获得claner输出? (优选的)
  • 以某种方式清理数据,使其适合带有如下列的data.frame: 运动|国家|比赛|日期|时间| Team1 | Team2 ......?

谢谢。

2 个答案:

答案 0 :(得分:1)

有些事情让这有点复杂。我使用不同的方法进行webscraping,但那里的代码可以帮助你一些

library(RCurl)
library(XML)
library(stringr)
library(tidyr)
url<-"http://www.wettportal.com/quotenvergleich/valuebets/"
url2<-getURL(url)
parsed<-htmlParse(url2,encoding = "UTF-8")

info1<-xpathSApply(parsed,"//div[@id='datagrid_content']//h2/span[1]",xmlValue)
date<-xpathSApply(parsed,"//th/time",xmlValue)
df<-data.frame(matrix(unlist(str_split(info1," . ",n = 3)),nrow=length(info1),byrow=T))
colnames(df)<-c("Sport","Country","Competition")
df<-cbind(df,date)
time<-xpathSApply(parsed,"//div[@id='datagrid_content']//tbody/tr/td[1]",xmlValue)
teams<-xpathSApply(parsed,"//div[@id='datagrid_content']//a/span",xmlValue)
ID<-1
for (i in 2:length(teams)){
    if (teams[i]==teams[i-1]){
        x<-max(ID,na.rm=TRUE)
    } else {
        x=max(ID,na.rm=TRUE)+1
    }
    ID<-c(ID,x)

}
df2<-cbind(teams,ID,time)
df$ID<-1:nrow(df)

final<-merge(df2,df)
final<-separate(final,col = teams,into=c("team1","team2"),sep =" - ")
final<-final[ ,c(5:8,4,2,3,1)]

enter image description here

答案 1 :(得分:0)

我没有按照您在执行代码时所期望的那样,但它完全按照您的要求执行操作:它返回divid="datagrid_content"的所有xmlvalue。

  • 现在,如果你想要一个data.frame,你必须编写一个代码,这样它就会给你一个data.frame。
  • 数据很乱,你必须清理它。没有自动的方式。例如,您可以删除一些特殊字符,然后使用|:strsplit(gsub("\r|\n","",data)," | ")
  • 拆分数据
  • 由于数据在表格中,您还可以执行以下操作:

    数据&lt; - htmldoc%&gt;% html_nodes(的xpath =&#39; // * [@类=&#34;表型-LIGA-1&#34;]&#39;)%GT;% html_table()

您可以获取data.frame列表。