【发布时间】:2017-04-05 07:58:00
【问题描述】:
我正在从以下新闻源 rss 创建一个数据集 http://indianexpress.com/section/india/feed/
我正在从这个 xml 中读取以下数据
- 标题
- 标题网址
- 发布日期
我现在使用标题 url 来获取描述(概要,在主标题下方) - 通过点击每个 url 并抓取数据
但是,我面临向量长度 (197) 与其他向量长度 (200) 不匹配的描述。 因此,我无法创建我的数据框
有人可以帮助我如何有效地抓取数据
以下代码可重现
library("httr")
library("RCurl")
library("jsonlite")
library("lubridate")
library("rvest")
library("XML")
library("stringr")
url = "http://indianexpress.com/section/india/feed/"
newstopics = getURL(url)
newsxml = xmlParse(newstopics)
title <- xpathApply(newsxml, "//item/title", xmlValue)
title <- unlist(title)
titleurl <- xpathSApply(newsxml, '//item/link', xmlValue)
pubdate <- xpathSApply(newsxml, '//item/pubDate', xmlValue)
t1 = Sys.time()
desc <- NULL
for (i in 1:length(titleurl)){
page = read_html(titleurl[i])
temp = html_text(html_nodes(page,'.synopsis'))
desc = c(desc,temp)
}
print(difftime(Sys.time(), t1, units = 'sec'))
desc = gsub("\n",' ',desc)
newsdata = data.frame(title,titleurl,desc,pubdate)
我收到以下错误:
Error in data.frame(title, titleurl, desc, pubdate) :
arguments imply differing number of rows: 200, 197
【问题讨论】:
-
我认为问题与
temp没有为for循环中的每次迭代返回一个值有关。尝试用desc = c(desc, paste0("", temp))替换desc行——尽管需要更优雅的错误处理。 -
我检查了 titleurl 不是到处都是空的。我假设由于每个网址都是报纸链接,它们肯定会有一个副标题
标签: r web-scraping