3

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 つのランクのリストであり、ギャップはありません)。データ出力も、データフレームへのアタッチに問題があったクラスのものです。

このテーブルからデータフレームに情報を抽出するより良い方法を知っている人はいますか?

どんな助けでも大歓迎です!

トム

4

2 に答える 2

5

これは、各種の名前をその構成要素に分割する別のソリューションです

library(XML)
library(plyr)

# read url into html tree
url = "http://www.theplantlist.org/tpl/record/kew-419248"
doc = htmlTreeParse(url, useInternalNodes = T)

# extract nodes containing desired information
xp_expr = "//table[@class= 'names synonyms']/tbody/tr"
nodes = getNodeSet(doc, xp_expr)

# function to extract desired fields from a given node    
fields = list('genus', 'species', 'infraspe', 'authorship')
read_node = function(node){

    dl = lapply(fields, function(x) xpathSApply(node, 
       paste(".//*[@class = ", "'", x, "'", "]", sep = ""), xmlValue))
    tmp = rep(' ', length(dl))
    tmp[sapply(dl, length) == 1] = unlist(dl)
    confidence = xpathSApply(node, './/img', xmlGetAttr, 'alt')
    return(c(tmp, confidence))
}

# apply function to all nodes and return data frame
df = ldply(nodes, read_node)
names(df) = c(fields, 'confidence')

次の出力が生成されます

 genus      species     infraspe                      authorship confidence
1 Critesion     chilense              (Roem. & Schult.) Ã\u0081.Löve          H
2   Hordeum     chilense     chilense                                          L
3   Hordeum  cylindricum                                       Steud.          H
4   Hordeum depauperatum                                       Steud.          H
5   Hordeum     pratense brongniartii                       Macloskie          L
6   Hordeum    secalinum     chilense                   Ã\u0089.Desv.          L
于 2011-06-21T16:59:50.303 に答える
2

次のコードは、テーブルを解析してマトリックスにします。

警告:

  • これはテキストではなく画像であるため、信頼度の列は空白です。これが重要な場合は、画像の場所を取得して解析できる必要があります。
  • エンコーディングの問題がいくつかあります (私のマシンでは UTF-8 文字が ASCII に変換されます)。これを修正する方法はまだわかりません。

コード:

library(XML)
library(RCurl)

baseURL <- "http://www.theplantlist.org/tpl/record/kew-419248"
txt <- getURL(url=baseURL)

xmltext <- htmlParse(txt, asText=TRUE)
xmltable <- xpathApply(xmltext, "//table//tbody//tr")
t(sapply(xmltable, function(x)unname(xmlSApply(x, xmlValue))[c(1, 3, 5, 7)]))

結果:

     [,1]                                                [,2]      [,3] [,4]  
[1,] "Critesion chilense (Roem. & Schult.) Ã.Löve" "Synonym" ""   "WCSP"
[2,] "Hordeum chilense var. chilense "                   "Synonym" ""   "TRO" 
[3,] "Hordeum cylindricum Steud. [Illegitimate]"         "Synonym" ""   "WCSP"
[4,] "Hordeum depauperatum Steud."                       "Synonym" ""   "WCSP"
[5,] "Hordeum pratense var. brongniartii Macloskie"      "Synonym" ""   "WCSP"
[6,] "Hordeum secalinum var. chilense Ã.Desv."        "Synonym" ""   "WCSP"
于 2011-06-21T15:13:59.783 に答える