【问题标题】:scraping an interactive table in R with rvest使用 rvest 在 R 中抓取交互式表格
【发布时间】:2018-06-27 23:16:25
【问题描述】:

我正在尝试从以下链接中抓取滚动表:http://proximityone.com/cd114_2013_2014.htm

我正在使用 rvest,但无法为表找到正确的 xpath。我目前的代码如下:

url <- "http://proximityone.com/cd114_2013_2014.htm" 
table <- gis_data_html %>%
html_node(xpath = '//span') %>%
html_table()

目前我收到错误“没有适用于 'html_table' 的方法应用于类“xml_missing”的对象”

有人知道我需要更改什么内容才能抓取链接中的交互式表格吗?

【问题讨论】:

    标签: r rvest


    【解决方案1】:

    所以您面临的问题是rvest 会读取页面的源代码,但不会执行页面上的 javascript。当我检查交互式表格时,我看到了

    <textarea id="aw52-box-focus" class="aw-control-focus " tabindex="0" 
    onbeforedeactivate="AW(this,event)" onselectstart="AW(this,event)" 
    onbeforecopy="AW(this,event)" oncut="AW(this,event)" oncopy="AW(this,event)" 
    onpaste="AW(this,event)" style="z-index: 1; width: 100%; height: 100%;">
    </textarea>
    

    但是当我查看页面源时,“aw52-box-focus”不存在。这是因为它是在通过 javascript 加载页面时创建的。

    您有几个选择来处理这个问题。 “简单”的方法是使用RSelenium 并使用实际浏览器加载页面,然后在加载后获取元素。其他选项是通读 javascript 并查看它从哪里获取数据,然后利用它而不是抓取表格。

    更新

    事实证明,阅读 javascript 真的很容易 - 它只是加载一个 CSV 文件。地址为纯文本,http://proximityone.com/countytrends/cd114_acs2014utf8_hl.csv

    .csv 没有列标题,但它们也在 &lt;script&gt;

    var columns = [
    "FirstNnme",
    "LastName",
    "Party",
    "Feature",
    "St",
    "CD",
    "State<br>CD",
    "State<br>CD",
    "Population<br>2013", 
    "Population<br>2014", 
    "PopCh<br>2013-14", 
    "%PopCh<br>2013-14", 
    "MHI<br>2013", 
    "MHI<br>2014", 
    "MHI<br>Change<br>2013-14", 
    "%MHI<br>Change<br>2013-14", 
    "MFI<br>2013", 
    "MFI<br>2014", 
    "MFI<br>Change<br>2013-14", 
    "%MFI<br>Change<br>2013-14", 
    "MHV<br>2013", 
    "MHV<br>2014", 
    "MHV<br>Change<br>2013-14", 
    "%MHV<br>Change<br>2013-14", 
    
    ]
    

    程序化解决方案

    您也可以通过编程方式尝试这个 pro,而不是深入研究 javacript(如果您想要这个网站上有几个这样的页面)。我们阅读页面,获取&lt;script&gt; 注释,获取“文本”(脚本本身)并查找对 csv 文件的引用。然后我们展开相对 URL 并将其读入。这对列名没有帮助,但也不应该太难提取。

    library(rvest)
    page = read_html("http://proximityone.com/cd114_2013_2014.htm")
    scripts = page %>% 
      html_nodes("script") %>% 
      html_text() %>% 
      grep("\\.csv",.,value=T)
    relCSV = stringr::str_extract(scripts,"\\.\\./.*?csv")
    fullCSV = gsub("\\.\\.","http://proximityone.com",relCSV)
    data = read.csv(fullCSV,header = FALSE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2017-03-01
      相关资源
      最近更新 更多