R - 使用 rvest restrict html_node to element of html_nodes result
R - using rvest restrict html_node to element of html_nodes result
我正在使用 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")]')
这个 returns 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&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()
操作?
这感觉超级笨拙,但确实有效。
library(XML)
reviews %>%
.[[1]] %>%
saveXML() %>%
html() %>%
html_node(xpath='//img[contains(@width,"102")]')
saveXML
函数来自 library(XML)
returns HTML 子集的字符串,然后可以作为 XML 文档读回但没有文档其余部分的开销。
在xpath中,//
表示在文档的任意位置搜索。您需要使用 .
:
来锚定它
reviews %>%
.[[1]] %>%
html_node(xpath='.//img[contains(@width,"102")]')
#> NULL
我正在使用 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")]')
这个 returns 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&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()
操作?
这感觉超级笨拙,但确实有效。
library(XML)
reviews %>%
.[[1]] %>%
saveXML() %>%
html() %>%
html_node(xpath='//img[contains(@width,"102")]')
saveXML
函数来自 library(XML)
returns HTML 子集的字符串,然后可以作为 XML 文档读回但没有文档其余部分的开销。
在xpath中,//
表示在文档的任意位置搜索。您需要使用 .
:
reviews %>%
.[[1]] %>%
html_node(xpath='.//img[contains(@width,"102")]')
#> NULL