如何在具有多个表的页面中使用rvest进行刮擦

时间:2017-11-01 23:19:44

标签: html r web-scraping rvest

我正在尝试从hockey-reference awards page的每个表格中删除数据。我可以为哈特纪念杯赢得第一张桌子,但是当我尝试其余的时候,我最终得到了空的矢量。我使用Selector Gadgetrvest package生成以下代码。

library(rvest)
url="https://www.hockey-reference.com/awards/voting-2017.html"
byng<-read_html(url)
byng_node<-html_nodes(byng, "#byng_stats .right , #byng_stats a")
byng_text<-html_text(byng_node)

但是,一旦我运行此代码,我就不会在byng变量中获得数据:

> byng_node
{xml_nodeset (0)}
> byng_text
character(0)

这里发生了什么?选择器小工具不适用于具有多个表的页面吗?它与此无关吗?还有一些我不理解的HTMLy?非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

@neilfws是对的:如果你查看HTML页面的源代码,你会看到除第一个表之外的所有表都被评论,因此rvest认为它们是注释,而不是源代码本身的一部分。让我们做一个肮脏的黑客并删除用于评论我们珍贵表格的这些字符:

library(rvest)
url="https://www.hockey-reference.com/awards/voting-2017.html"
byng<-read_html(url)
# Remove commenting sequences
byng <- gsub("<!--", "", byng)
byng <-  gsub("-->", "", byng)
byng<-read_html(byng)
#Get tables as a list of dataframes
tables <- html_table(byng)
# Last table
tables[7]
[[1]]
                                                                         Scoring Scoring Scoring Scoring Goalie Stats Goalie Stats
1  Place              Player Age  Tm Pos Votes Vote% 1st 2nd 3rd 4th 5th       G       A     PTS     +/-            W            L
2      1      Connor McDavid  20 EDM   C   762 94.07 141  18   3   0   0      30      70     100      27                          
3      2       Sidney Crosby  29 PIT   C   526 64.94  20 142   0   0   0      44      45      89      17                          
4      3   Nicklas Backstrom  29 WSH   C   127 15.68   1   2 116   0   0      23      63      86      17                          
5      4      Mark Scheifele  23 WPG   C    21  2.59   0   0  21   0   0      32      50      82      18                          
6      5     Auston Matthews  19 TOR   C    10  1.23   0   0  10   0   0      40      29      69       2                          
7      6       Evgeni Malkin  30 PIT   C     4  0.49   0   0   4   0   0      33      39      72      18                          
8      7        John Tavares  26 NYI   C     2  0.25   0   0   2   0   0      28      38      66       4                          
9      8      Jonathan Toews  28 CHI   C     1  0.12   0   0   1   0   0      21      37      58       7                          
10     8       Brad Marchand  28 BOS   C     1  0.12   0   0   1   0   0      39      46      85      18                          
11     8         Ryan Kesler  32 ANA   C     1  0.12   0   0   1   0   0      22      36      58       8                          
12     8        Ryan Getzlaf  31 ANA   C     1  0.12   0   0   1   0   0      15      58      73       7