Rvest没有识别css选择器

时间:2015-12-26 18:02:45

标签: r web-scraping rvest

我试图抓住这个网站:

http://www.racingpost.com/greyhounds/result_home.sd#resultDay=2015-12-26&meetingId=18&isFullMeeting=true

通过R。

中的rvest

不幸的是rvest似乎没有通过CSS选择器识别节点。

例如,如果我尝试提取每个表(Grade,Prize,Distance)标题中的信息,其CSS选择器为" .black"我运行这段代码:

URL <- read_html("http://www.racingpost.com/greyhounds/result_home.sd#resultDay=2015-12-26&meetingId=18&isFullMeeting=true")
nodes<-html_nodes(URL, ".black") 

节点出来是一个空列表,所以它不会刮掉任何东西。

2 个答案:

答案 0 :(得分:4)

它正在发出XHR请求来生成HTML。试试这个(这也应该可以更容易地自动化数据捕获):

library(httr)
library(xml2)
library(rvest)

res <- GET("http://www.racingpost.com/greyhounds/result_by_meeting_full.sd",
           query=list(r_date="2015-12-26",
                      meeting_id=18))

doc <- read_html(content(res, as="text"))

html_nodes(doc, ".black")
## {xml_nodeset (56)}
##  [1] <span class="black">A9</span>
##  [2] <span class="black">£61</span>
##  [3] <span class="black">470m</span>
##  [4] <span class="black">-30</span>
##  [5] <span class="black">H2</span>
##  [6] <span class="black">£105</span>
##  [7] <span class="black">470m</span>
##  [8] <span class="black">-30</span>
##  [9] <span class="black">A7</span>
## [10] <span class="black">£61</span>
## [11] <span class="black">470m</span>
## [12] <span class="black">-30</span>
## [13] <span class="black">A5</span>
## [14] <span class="black">£66</span>
## [15] <span class="black">470m</span>
## [16] <span class="black">-30</span>
## [17] <span class="black">A8</span>
## [18] <span class="black">£61</span>
## [19] <span class="black">470m</span>
## [20] <span class="black">-20</span>
## ...

答案 1 :(得分:0)

您的选择器很好,rvest工作得很好。问题是您要查找的内容不在url对象中。

如果您打开该网站并使用网络浏览器检查工具,您会看到所需的所有数据都是<div id="resultMainOutput">的后代。现在,如果你查找这个网站的源代码,你会这样(添加换行符以便于阅读):

<div id="resultMainOutput">
    <div class="wait">
       <img src="http://ui.racingpost.com/img/all/loading.gif" alt="Loading..." />
    </div>
</div>

您想要的数据动态加载rvest无法应对。它只能获取网站源代码并检索没有任何客户端处理的任何内容。

rvest-introducing blog post中提出了完全相同的问题,这是包裹作者不得不说的:

  

对于这样的页面,您有两种选择:

     
      
  1. 使用Web浏览器中的调试控制台对通信协议进行反向工程,并直接从服务器请求原始数据。

  2.   
  3. 使用像RSelenium这样的软件包来自动化Web浏览器。

  4.   

如果您不需要反复获取该数据,或者您可以在每次分析中接受一些手动工作,最简单的解决方法是:

  1. 在首选的网络浏览器中打开网站
  2. 使用网络浏览器检查工具,复制当前网站内容(整页或仅<div id="resultMainOutput">内容)
  3. 将该内容粘贴到文本编辑器中并将其另存为新文件
  4. 对该文件运行分析
  5. > url <- read_html("/tmp/racingpost.html")
    > html_nodes(url, ".black")
    # {xml_nodeset (56)}
    # [1] <span class="black">A9</span>
    # [2] <span class="black">£61</span>
    # [3] <span class="black">470m</span>
    # [4] <span class="black">-30</span>
    # (skip the rest)
    

    正如您所看到的,在此过程中存在一些编码问题,但它们可以在以后解决。