xmlValue中的参数错误是什么?

时间:2016-11-28 20:51:19

标签: r xml parsing xpath web-scraping

我是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> 不能应用于此数据类型或此类性质的东西。

由于教程中的代码适用于作者,我可能错过了一些明显的东西,或者存在库加载序列和相关的函数掩码问题。 (虽然我玩过它)。

非常感谢任何建议或帮助。

2 个答案:

答案 0 :(得分:0)

那&#34;教程&#34;是rvestXML的奇怪组合。如果您使用rvest,请使用该包中的函数,例如html_textxml2包也适用于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))