0

我正在尝试使用新的 rvest 包抓取一组网页。它适用于大多数网页,但是当没有特定字母的表格条目时,会返回错误。

# install the packages you need, as appropriate
install.packages("devtools")
library(devtools)
install_github("hadley/rvest")
library(rvest)

此代码可以正常工作,因为网页上有字母 E 的条目。

# works OK
url <- "https://www.propertytaxcard.com/ShopHillsborough/participants/alph/E"
pg <- html_session(url, user_agent("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0"))
pg %>% html_nodes(".sponsor-info .bold") %>% html_text()

这不起作用,因为网页上没有字母 F 的条目。错误消息是“类中的错误(输出)<-“XMLNodeSet”:尝试将属性设置为 NULL”

# yields error message
url <- "https://www.propertytaxcard.com/ShopHillsborough/participants/alph/F"
pg <- html_session(url, user_agent("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0"))   
pg %>% html_nodes(".sponsor-info .bold") %>% html_text()    

有什么建议么。提前致谢。

4

1 回答 1

1

您总是可以将pg...<code>html_nodes...<code>html_text 包装起来try并在之后测试该类:

tmp <- try(pg %>% html_nodes(".sponsor-info .bold") %>% html_text(), silent=TRUE)

if (class(tmp) == "character") {
  print("do stuff")
} else {
  print("do other stuff")
}

编辑:另一种选择是使用boolean()XPath 运算符并以这种方式进行测试:

html_nodes_exist <- function(rvest_session, xpath) {

  xpathApply(content(rvest_session$response, as="parsed"), 
             sprintf("boolean(%s)", xpath))

}

pg %>% html_nodes_exist("//td[@class='sponsor-info']/span[@class='bold']")

TRUE如果这些节点存在并且不存在,它将返回FALSE(该函数需要被泛化以能够使用session["HTMLInternalDocument" "HTMLInternalDocument" "XMLInternalDocument" "XMLAbstractDocument"]对象并与 CSS 选择器以及 XPath 一起使用,但这是一种避免try.

于 2014-11-02T18:36:39.910 回答