R - 使用rvest将html_node限制为html_nodes结果的元素

时间:2015-02-16 00:21:23

标签: r rvest

我正在使用rvest进行网页编写 - 对于试用我正在抓取IMDB电影的评论分数。对于此示例,我正在尝试从this site获取所有评论和相关用户名。请注意,并非所有评论都有星级评分 - 我想要的只是评价星级的评论。

我的开始代码:

library(rvest)
library(magrittr)

id = "0000001"
reviews = paste0("http://www.imdb.com/title/tt",id,"/reviews-index?start=0;count=10000000") %>% 
  html() %>%
  html_nodes(xpath='//td[contains(@class, "comment-summary")]') 

这将完全按照我的预期返回11条评论的列表(此电影有11条评论)。

当我尝试然后通过此列表检查是否存在星级评分时,我会得到意想不到的结果。

reviews %>%
  .[[1]] %>%
  html_node(xpath='//img[contains(@width,"102")]')

这会产生

<img width="102" height="12" alt="10/10" src="http://i.media-imdb.com/images/showtimes/100.gif"/>

但第一次审核实际上只包含:

<td class="comment-summary">
<a href="/user/ur0093335/"><img class="avatar" src="http://ia.media-imdb.com/images/M/MV5BMjI2NDEyMjYyMF5BMl5BanBnXkFtZTcwMzM3MDk0OQ@@._SX40_SY40_SS40_.jpg" height="width="/></a>
<h2><a href="reviews?count=10000000&amp;start=0">one-shot record of a belly dancer</a></h2>

<b>Author:</b>
     <a href="/user/ur0093335/">Brian Fuller (bfuller@montreat.edu)</a>
      <small>on 12 August 1998</small>
</td> 

我的代码返回的img在子集中不存在。 如何实际对html进行子集化,以便按照直觉的方式进行后续html_node()操作?

2 个答案:

答案 0 :(得分:2)

在xpath中,//表示搜索文档中的任何位置。您需要使用.锚定它:

reviews %>%
  .[[1]] %>%
  html_node(xpath='.//img[contains(@width,"102")]')
#> NULL

答案 1 :(得分:0)

这感觉超级笨拙,但它确实有效。

library(XML)
reviews %>%
  .[[1]] %>%
  saveXML() %>%
  html() %>%
  html_node(xpath='//img[contains(@width,"102")]')

来自saveXML的{​​{1}}函数返回HTML子集的字符串,然后可以作为XML文档读回,但没有文档其余部分的开销。