在 R 中将杂乱的抓取数据放入 data.frame
Get messy scraped data into data.frame in R
我正在努力抓取特定网站的某个部分,它看起来像 table 但不是(不幸的是)。
我用这个代码...
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。
任何人都知道如何
- select为了从一开始就获得claner输出的不同对象? (首选)
- 以某种方式清理数据,使其适合具有如下列的 data.frame:
运动 |国家 |比赛 |日期 |时间 |团队1 |团队 2 ... ?
谢谢。
我没有告诉你在执行你的代码时你期望得到什么,但它完全按照你告诉它的去做:它 returns div
中的所有 xmlvalue 和 id="datagrid_content"
.
- 现在如果你想要一个 data.frame,你必须写一个代码,这样它会给你一个 data.frame。
- 数据很乱,你得清理一下。没有自动的方法。比如可以去掉一些特殊字符,然后用|分割数据:
strsplit(gsub("\r|\n","",data)," | ")
由于数据在表格中,您还可以:
数据 <- htmldoc %>%
html_nodes(xpath='//*[@class="table-type-liga-1"]')%>%
html_table()
您可以获得 data.frame 的列表。
好吧,有些事情让这有点复杂。我使用不同的方法进行网络抓取,但下面的代码可以帮助你一点
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)]
我正在努力抓取特定网站的某个部分,它看起来像 table 但不是(不幸的是)。
我用这个代码...
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。
任何人都知道如何
- select为了从一开始就获得claner输出的不同对象? (首选)
- 以某种方式清理数据,使其适合具有如下列的 data.frame: 运动 |国家 |比赛 |日期 |时间 |团队1 |团队 2 ... ?
谢谢。
我没有告诉你在执行你的代码时你期望得到什么,但它完全按照你告诉它的去做:它 returns div
中的所有 xmlvalue 和 id="datagrid_content"
.
- 现在如果你想要一个 data.frame,你必须写一个代码,这样它会给你一个 data.frame。
- 数据很乱,你得清理一下。没有自动的方法。比如可以去掉一些特殊字符,然后用|分割数据:
strsplit(gsub("\r|\n","",data)," | ")
由于数据在表格中,您还可以:
数据 <- htmldoc %>% html_nodes(xpath='//*[@class="table-type-liga-1"]')%>% html_table()
您可以获得 data.frame 的列表。
好吧,有些事情让这有点复杂。我使用不同的方法进行网络抓取,但下面的代码可以帮助你一点
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)]