我正试图用新的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的条目。错误消息是“类中的错误(out)&lt; - ”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()
任何建议。提前谢谢。
答案 0 :(得分:1)
您可以随时将pg
... html_nodes
... 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
和{{1}对象并使用CSS选择器和XPath,但它是避免["HTMLInternalDocument" "HTMLInternalDocument" "XMLInternalDocument" "XMLAbstractDocument"]
的方法。