【问题标题】:Scraping embeded html table in R在 R 中抓取嵌入的 html 表
【发布时间】:2015-03-14 22:23:06
【问题描述】:

我对在 R 中抓取/解析 HTML 相当陌生。我正在尝试从 http://totalfootballstats.com/PlayerWR.asp?id=1218565 的职业接收统计和职业冲刺统计表中获取数据。 我知道 read readHTMLtable 函数,但是这两个表都嵌入了很多垃圾中,我似乎无法通过根的子节点。

编辑:上述问题已解决。但是对于网站http://www.sports-reference.com/cfb/players/a-index.html,我正在尝试遍历所有玩家并访问他们的数据。我在访问他们各自的 url 链接时遇到了麻烦。我试过了:

fb=htmlParse("http://www.sports-reference.com/cfb/players/a-index.html")
p1=getNodeSet(fb,'//pre')
con = textConnection(xmlValue(p1[[100]]))
players100 = read.table(con)

但这会导致错误“扫描错误(文件,内容,nmax,sep,dec,quote,skip,nlines,na.strings,: 第 3 行没有 5 个元素”

我尝试的另一件事是:

 links <- xpathSApply(fb, "//a/@href")

但我觉得应该有更好的方法来做到这一点?

【问题讨论】:

  • 欢迎来到 SO 并欢迎来到从可怕网站抓取数据的世界。如果您显示一些指示(通过代码,而不是文字)您实际上尝试了某些东西,您可能会得到一些具体的帮助(这不是代码编写服务)。
  • 我现在引用下面答案中提供的网站,但来自我拥有的原始播放器页面:fb=htmlParse("sports-reference.com/cfb/players/a-index.html") p1=getNodeSet(fb,'//pre') 来自在这里,我有点想用所有的球员、年份和附加的网址制作一个表格。我尝试为每个块制作一个表格,就像这样。con = textConnection(xmlValue(p1[[100]])) player100 = read.table (con)但这会导致错误:“扫描错误(文件,什么,nmax,sep,dec,quote,skip,nlines,na.strings,:第3行没有5个元素”
  • @user3451457 - 获取链接网址几乎总是//a/@href//link/@href
  • 另外,看看here了解如何获取页面上的所有链接,然后看看W3 Schools XML Tutorials

标签: html xml r parsing web-scraping


【解决方案1】:

这是来自不同网站的同一个播放器,干净得多。数据不匹配,所以有人弄错了。我的钱在 totalfootballstats.com 上。明智地选择您的资源!

readHTMLTable(
    "http://www.sports-reference.com/cfb/players/doyle-aaron-1.html"
)
# $receiving
#  Year     School Conf Class Pos  G Rec Yds  Avg TD Att Yds  Avg TD Plays Yds  Avg TD
# 1 1988 Miami (FL)  Ind        WR 11   1  12 12.0  0   1  34 34.0  0     2  46 23.0  0
# 2 1989 Miami (FL)  Ind        WR 11   8  93 11.6  1                     8  93 11.6  1

# $kick_ret
#   Year     School Conf Class Pos  G Ret Yds Avg TD Ret Yds Avg TD
# 1 1988 Miami (FL)  Ind        WR 11   1   8 8.0  0               
# 2 1989 Miami (FL)  Ind        WR 11                     

对于特定请求,您似乎可以像这样构造一个有效的 URL,这也将同时为多个玩家构造路径。

## base URI 
u <- "http://www.sports-reference.com"
## player first and last names
first <- "bill"
last <- "adams"
## use sprintf() to make all the paths at once
fullPath <- sprintf("%s/cfb/players/%s-%s-1.html", u, first, last)
## read the table - I think you'll need to loop readHTMLTable() though
readHTMLTable(fullPath)
# $receiving
#  Year School Conf Class Pos  G Rec Yds  Avg TD Att Yds Avg TD Plays Yds  Avg TD
# 1 1969 Dayton  Ind        WR 10   1   3  3.0  1                    1   3  3.0  1
# 2 1970 Dayton  Ind        WR 10   4  42 10.5  1                    4  42 10.5  1

【讨论】:

  • 我最初查看了这个站点但选择不使用它,因为我无法弄清楚如何从原始玩家页面访问每个玩家的数据:sports-reference.com/cfb/players/a-index.html。每个玩家块都在一些我不知道如何访问的 块中?
  • @user3451457 - 我添加了一个可能的方法。不过,您可能应该首先调查网站的一些路径,使用网络检查器只是为了确保它是一致的
  • 这看起来是个不错的方法,但我想弄清楚如何真正获取玩家姓名,而不是手动输入。我已经用我尝试过的方法编辑了我原来的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多