麻烦把桌子刮到R里

时间:2016-11-04 17:54:27

标签: javascript html r web-scraping rvest

我正在尝试并且未能按国家/地区从this web page搜索到平均智商的表格。我正在尝试按照this blog post中描述的流程,但我似乎无法找到正确的XPath。

这是我正在使用的代码,其中包含XPath到该表的占位符:

library(dplyr)
library(rvest)

url <- "https://iq-research.info/en/page/average-iq-by-country" 

xpath <- [xpath copied from Chrome using SelectorGadget]

IQ <- url %>%
  read_html() %>%
  html_nodes(xpath) %>%
  html_table()

我尝试在Chrome中使用选择器小工具来找到合适的XPath,但是当我切换它们时,有许多元素似乎将所需的表格绘制为蓝色。我尝试复制大多数或所有这些元素的XPath并将其用作xpath并获得两种类型的结果:{xml_nodeset (0)}Error in tokenize(css) : Unexpected character '/' found at position 1

我很感激帮助弄清楚如何到达那张桌子(以及将来我可能会遇到的那些)。

1 个答案:

答案 0 :(得分:0)

感谢@ hrbrmstr关于javascript问题的指针,我可以使用phantomjs并跟随this tutorial完成此操作。具体来说,我:

  1. 将Windows的phantomjs从this site下载到我的工作目录;
  2. 在Windows资源管理器中,手动将文件phantomjs.exe解压缩到我的工作目录(我想我可以在R中使用download.fileunzip完成1和2,但是...) ;
  3. 复制步骤1中指定的教程中显示的'scrape_techstars.js'文件,将其粘贴到记事本中,编辑它以适合我的情况,并将其保存到我的工作目录中“scrape_iq.js”;
  4. 回到我的R控制台,运行system("./phantomjs scrape_iq.js");
  5. 回到Windows资源管理器,查看我的工作目录,找到在步骤4中创建的html文件(“iq.html”),右键单击该html文件,然后选择打开&gt;谷歌浏览器;
  6. 在已启动的Chrome标签页中,右键单击页面并选择Inspect;
  7. 在桌子上匆匆忙忙,我想抓住并查看“元素”窗口,确认它是“table”类型的节点;最后,
  8. 将下面的R代码从“iq.html”中删除。
  9. 这是我在步骤3中创建并在步骤4中使用的.js文件:

    // scrape_iq.js
    
    var webPage = require('webpage');
    var page = webPage.create();
    
    var fs = require('fs');
    var path = 'iq.html'
    
    page.open('https://iq-research.info/en/page/average-iq-by-country', function (status) {
      var content = page.content;
      fs.write(path,content,'w')
      phantom.exit();
    });
    

    这是我在步骤8中使用的R代码,用于从本地html文件phantomjs中创建表,并在我的工作区中获取一个名为IQ的数据框。

    library(dplyr)
    library(rvest)
    
    IQ <- read_html("iq.html") %>%
      html_nodes('table') %>%
      html_table() %>%
      .[[1]]
    

    这是产生数据框的头部:

    > head(IQ)
      Rank     Country  IQ
    1    1   Hong Kong 108
    2    1   Singapore 108
    3    2 South Korea 106
    4    3       Japan 105
    5    3       China 105
    6    4      Taiwan 104