2014-11-02 70 views
0

我試圖用新的rvest軟件包刮一組網頁。它適用於大多數網頁,但是當特定字母沒有表格條目時,會返回錯誤。rvest錯誤:「錯誤類(out)< - 」XMLNodeSet「:試圖設置一個屬性爲NULL」

# 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()  

任何建議。提前致謝。

回答

1

你總是可以包裹pg ... html_nodes ...在tryhtml_text和測試類算賬:

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如果他們不這樣做(需要被推廣到b中的功能能夠使用session["HTMLInternalDocument" "HTMLInternalDocument" "XMLInternalDocument" "XMLAbstractDocument"]對象,並可以與CSS選擇器以及XPath一起使用,但它是避免try的一種方法。

+0

該解決方案運行良好。感謝您的快速響應。 – hackR 2014-11-02 18:48:15

+0

僅供參考'xml2'的最新版本有更新的方法來處理這個問題。我會在明天發佈更新。 – hrbrmstr 2016-10-27 02:33:57

相關問題