http://www.theplantlist.org/tpl/record/kew-419248および多くの非常に類似したページの単一の html テーブルからデータをスクレイピング/抽出しようとしています。最初に次の関数を使用してテーブルを読み取ろうとしましたが、各種の名前をその構成要素 (属/種/基種/著者など) に分けたいため、理想的ではありませんでした。
library(XML)
readHTMLTable("http://www.theplantlist.org/tpl/record/kew-419248")
SelectorGadget を使用して、抽出する各テーブル要素への一意の XPATH を識別しました (必ずしも最短ではありません)。
属名の場合: // [contains(concat( " ", @class, " " ), concat( " ", "Synonym", " " ))]// [contains(concat( " ", @class, " " ), concat( " ", "属", " " ))]
種名の場合: // [contains(concat( " ", @class, " " ), concat( " ", "Synonym", " " ))]// [contains(concat( " ", @class, " " ), concat( " ", "種", " " ))]
種内ランクの場合: //*[contains(concat( " ", @class, " " ), concat( " ", "infraspr", " " ))]
種内名の場合: //*[contains(concat( " ", @class, " " ), concat( " ", "infraspe", " " ))]
信頼レベル (画像) の場合: // [contains(concat( " ", @class, " " ), concat( " ", "synonyms", " " ))]//img ソースの場合: // [contains(concat ( " ", @class, " " ), concat( " ", "ソース", " " ))]//a
情報をデータフレーム/テーブルに抽出したいと思います。
XML パッケージの xpathSApply 関数を使用して、このデータの一部を抽出してみました。
たとえば、種内ランクの場合
library(XML)
library(RCurl)
infraspeciesrank = htmlParse(getURL("http://www.theplantlist.org/tpl/record/kew-419248"))
path=' //*[contains(concat( " ", @class, " " ), concat( " ", "infraspr", " " ))]'
xpathSApply(infraspeciesrank, path)
ただし、この方法はデータにギャップがあるため問題があります (たとえば、テーブルの一部の行だけが種以下のランクを持っているため、返されたのはテーブル内の 3 つのランクのリストであり、ギャップはありません)。データ出力も、データフレームへのアタッチに問題があったクラスのものです。
このテーブルからデータフレームに情報を抽出するより良い方法を知っている人はいますか?
どんな助けでも大歓迎です!
トム