0

新しい rvest パッケージを使用して一連の Web ページをスクレイピングしようとしています。ほとんどの Web ページで機能しますが、特定の文字に表形式のエントリがない場合、エラーが返されます。

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

Web ページに文字 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()

Web ページに文字 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")
}

編集:もう1つのオプションは、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を使用し、CSS セレクターと XPath の両方で動作できるように一般化する必要がありますが、回避する方法です。session["HTMLInternalDocument" "HTMLInternalDocument" "XMLInternalDocument" "XMLAbstractDocument"]try

于 2014-11-02T18:36:39.910 に答える