【问题标题】:R - using rvest restrict html_node to element of html_nodes resultR - 使用 rvest 将 html_node 限制为 html_nodes 结果的元素
【发布时间】:2015-02-16 00:21:22
【问题描述】:

我正在使用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() 操作?

【问题讨论】:

    标签: r rvest


    【解决方案1】:

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

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

    【讨论】:

    • 这不起作用 - 它只返回空值。 lapply(reviews,html_node,xpath='/img[contains(@width,"102")]') 在应该有 7 个非空值时返回 11 个 NULL 的列表
    • @Mark 哎呀,是的,我很困惑。新的表达应该是正确的
    【解决方案2】:

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

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

    library(XML) 中的 saveXML 函数返回 HTML 子集的字符串,然后可以将其作为 XML 文档读回,但不会产生文档其余部分的开销。

    【讨论】:

    • 虽然这对我有用,但我宁愿找到一个更好的解决方案来保持单一的工作流程。
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多