【问题标题】:Get messy scraped data into data.frame in R将凌乱的抓取数据放入 R 中的 data.frame
【发布时间】:2016-10-09 17:13:20
【问题描述】:

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

我用这个代码...

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: 运动 |国家 |比赛 |日期 |时间 |团队1 | Team2 ... ?

谢谢。

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

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

    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)]
    

    【讨论】:

    • 哇,非常感谢!我实际上希望暗示可能的“workaraounds”或其他任何东西,但没想到有人会一路走下去。此外,感谢您向我展示了另一种在 R 中进行网络抓取的方法 ;-)
    • 还有一个问题:您使用什么工具来精确查找元素的 Xpath?我在 Chrome 中使用 selectorGadget 和 F12,但它不会为代码中的元素显示相同的 Xpath...
    • 我的方法有点不同。通过使用 chrome 开发人员工具,我找到了一个存储所需值的标签。例如,在团队向量的情况下,我注意到所有都在 span 标签内。但是整个页面中可能有很多跨度标签,所以我使用“a/span”来表示我只想使用 a 作为标签上一级的跨度。我试图运行代码,但它返回了更多数据。所以我限制了以 div 作为父级的选择。所以我通常的方法是从值所在的标签开始,然后根据需要添加父标签而不是指定绝对路径
    【解决方案2】:

    执行代码时,我没有按照您的预期得到,但它完全按照您的要求执行:它返回 divid="datagrid_content" 中的所有 xmlvalue。

    • 现在,如果您想要一个 data.frame,您必须编写一个代码,以便它会为您提供一个 data.frame。
    • 数据乱七八糟,你得清理一下。没有自动的方法。比如可以去掉一些特殊字符,然后用|分割数据:strsplit(gsub("\r|\n","",data)," | ")
    • 由于数据在表格中,您还可以这样做:

      数据 % html_nodes(xpath='//*[@class="table-type-liga-1"]')%>% html_table()

    你可以得到一个data.frame的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-30
      • 2011-04-11
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      相关资源
      最近更新 更多