我是R.的新手。我想抓取多页的html页面,并通过XPath创建一个包含特定数据的列的数据集。我找到了一个有用的抓取tutorial。
我的计划是遵循链接中的脚本并首先使其工作/理解,然后自定义到我的网站/ html / xpath。
但是,当我在代码中运行第二个块(刮掉博客帖子)时,我收到此错误:
UseMethod(“xmlValue”)中的错误: 没有适用于'xmlValue'的方法应用于类“xml_node”的对象。
这是破坏代码的行:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/PrimaryColor</item>
<item name="colorPrimaryDark">@color/PrimaryDarkColor</item>
<!-- Customize your theme here. -->
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
</resources>
pages变量包含一个节点集:
pages<-sapply(pages,xmlValue)
我认为{xml_nodeset (1)}
[1] <span class="pages">Page 1 of 25</span>
不能应用于此数据类型或此类性质的东西。
由于教程中的代码适用于作者,我可能错过了一些明显的东西,或者存在库加载序列和相关的函数掩码问题。 (虽然我玩过它)。
非常感谢任何建议或帮助。
答案 0 :(得分:0)
那&#34;教程&#34;是rvest
和XML
的奇怪组合。如果您使用rvest
,请使用该包中的函数,例如html_text
。 xml2
包也适用于rvest
,但不适用于XML
。来自html
的警告信息也应该告诉您它已过时。
page_data <- html(theURL)
##Warning message: 'html' is deprecated.
page_data %>%
html_nodes(xpath='//*[@id="leftcontent"]/div[11]/span[1]') %>%
html_text
[1] "Page 1 of 25"
答案 1 :(得分:0)
将XML
视为您xpathSApply
来电时唯一需要的套餐:
library(XML)
theURL <- "http://www.r-bloggers.com/search/web%20scraping"
page_data <- htmlParse(readLines(theURL, warn = FALSE))
pages <- xpathSApply(doc, '//*[@id="leftcontent"]/div[11]/span[1]', xmlValue)
pages <- as.numeric(regmatches(pages, regexpr("[0-9]+$", pages)))
scrape_r_bloggers_page <- function(doc, page){
titles <- xpathSApply(doc, '//div[contains(@id,"post")]/h2/a', xmlValue)
descriptions <- xpathSApply(doc, '//div[contains(@id,"post")]/div[2]/p[1]', xmlValue)
dates <- xpathSApply(doc, '//div[contains(@id,"post")]/div[1]/div', xmlValue)
authors <- xpathSApply(doc, '//div[contains(@id,"post")]/div[1]/a', xmlValue)
urls <- xpathSApply(doc, '//div[contains(@id,"post")]/h2/a', xmlValue)
blog_posts_df <- data.frame(title=titles,
description=descriptions,
author=authors,
date=dates,
url=urls,
page=page)
}
blogsdf <- scrape_r_bloggers_page(page_data, 1)
blogsList <- lapply(c(2:(pages-1)), function (page) {
Sys.sleep(1)
theURL <- paste("http://www.r-bloggers.com/search/web%20scraping/page/",page,"/",sep="")
page_data <- htmlParse(readLines(theURL, warn = FALSE))
scrape_r_bloggers_page(page_data, page)
})
finaldf <- rbind(blogsdf, do.call(rbind, blogsList))