6

RのXMLパッケージでxpathApply関数を使用して、htmlファイルから特定のデータを抽出しようとしています。ただし、HTML ドキュメントのいくつかの親ノードで xpathApply を使用した後、結果のオブジェクトのクラスは XMLNodeSet になり、次のエラー メッセージが表示されるため、そのようなオブジェクトで xpathApply をさらに使用することはできません。クラス「XMLNodeSet」のオブジェクトに適用される「xpathApply」に適用可能なメソッドはありません」</p>

ここに私が問題を再現しようとしている R スクリプトがあります (この例は単なるテーブルです。テーブル):

library(XML)
y <- htmlParse(htmlfile)
x <- xpathApply(y, "//table/tr")
z <- xpathApply(x, "/td")

「htmlファイル」は次のとおりです。

<table>
<tr>
<td> Test1.1 </td> <td> Test1.2 </td>
</tr>
<tr>
<td> Test1.3 </td> <td> Test1.4 </td>
</tr>
</table>

xpathApply を使用した後、ノードでさらに作業する方法はありますか? または、ノード内のデータを操作する他の良い方法はありますか?

4

3 に答える 3

2

ノードのリストを取得したら、それに関数を適用してノードを抽出できます。xmlValueまたは... のような関数xmlGetAttr。たとえば、次のようになります。

x <- xpathApply(y, "//table/tr")
sapply(x,xmlValue)          ## it a list of nodes..
 " Test1.1  Test1.2 " " Test1.3  Test1.4 "

do と同等です:

xpathSApply(y,"//table/tr",xmlValue)
" Test1.1  Test1.2 " " Test1.3  Test1.4 "

編集

あなたの質問は、正しい xpath によって解決できると確信しています。データベースを操作するときは、xml ファイルの操作を学習する必要があります。xpath は、SQL クエリに似ています。これは高速であり、多くのブラウザーで適切な xpath を生成するのに役立ちます。

例えば ​​:

 xpathSApply(y,"//table/tr[2]/td[1]",xmlValue) #  second tr and first td
 [1] " Test1.3 "
 xpathSApply(y,"//table/tr[2]/td[3]",xmlValue) #  second tr and third td

編集

OPは、彼がXML構造を複製したい場合のように見えます( tr と td を同じ順序で取得します)

これが方法です。より効率的な方法だとは思いません...

nn.trs <- length(xpathSApply(y,"//table/tr",I))
lapply(seq(nn.trs),function(i){
       xpathSApply(y,paste("//table/tr[",i,"]/td",sep=''),xmlValue)
})
[[1]]
[1] " Test1.1 " " Test1.2 "

[[2]]
[1] " Test1.3 " " Test1.4 "

各 tr で td の数がすべて同じである場合、次のように置き換えると、次のようlapplysapplyなります。

    [,1]        [,2]       
[1,] " Test1.1 " " Test1.3 "
[2,] " Test1.2 " " Test1.4 "

しかし、この場合は readHtmlTable の方が優れていると思います..

于 2013-02-19T13:08:31.100 に答える
1

以下は機能しているようです。基本的に、によって返されるリストの要素を検索する必要がありますxpathApply

> y <- htmlParse(htmlfile)
> x <- xpathApply(y, "//table/tr")
> x
[[1]]
<tr><td> Test1.1 </td> <td> Test1.2 </td>
</tr> 

[[2]]
<tr><td> Test1.3 </td> <td> Test1.4 </td>
</tr> 

attr(,"class")
[1] "XMLNodeSet"
> z <- xpathApply(x[[1]], "//td")
> z
[[1]]
<td> Test1.1 </td> 

[[2]]
<td> Test1.2 </td> 

[[3]]
<td> Test1.3 </td> 

[[4]]
<td> Test1.4 </td> 

attr(,"class")
[1] "XMLNodeSet"

PS:なぜそれがxリストのすべての要素だけでなく検索するのかわかりませんx[[1]]。バグのようです。

于 2013-02-19T13:14:30.543 に答える