2016-11-16 10 views
0

私のデータは、バグの再現手順を含む文字列のリストで構成されています。これらは通常htmlとしてエンコードされますが、時には生のテキストであり、場合によっては空です(NA)。私はテキストが必要です。私はこれをrvestで達成しようとしていますが、私は問題にぶち当たっています。htmlを使用してhtmlの断片を解析するにはどうすればよいですか?

私は、HTMLの行を解析して文字列を返します。この機能を持っている:

library(rvest) 
tf <- function(frag) {read_html(frag) %>% html_nodes("p") %>% html_text() %>% paste0(collapse = " ")} 

は、これは適切なHTML上で動作します:予想通り

foo <- c("<p>captain <p>tightpants", "<p>malcolm <p>reynolds") 
lapply(foo, tf) 

作品を。私は2本の紐を取り戻す。

:私はhtmlのない文字列を持っている場合、それはまた、ファイルをロードしようとし、同様に

foo <- c("<p>captain <p>tightpants", "<p>malcolm <p>reynolds", NA) 
lapply(foo, tf) 

:私はNASに持っている場合

は、それが「NA」という名前のファイルをロードしよう

foo <- c("<p>captain <p>tightpants", "<p>malcolm <p>reynolds", "something else") 
lapply(foo, tf) 

文字列がhtmlであると常に仮定してrvestを取得する方法はありますか?私が使用しなければならない別のパッケージがありますか?

+0

XMLライブラリはずっと便利ではありませんが、この問題を克服するasTextパラメータを持っています。そのようなものがありますか? –

答えて

1

おそらく、あなたは常にHTMLを持っており、すべてのテキストを取得するために、よりリベラルのXPathセレクタを使用して最初のhtmltidy::tidy_html()によるベクトル要素を渡す(およびそれを返す前にそれをクリーンアップ):

library(rvest) 
library(htmltidy) 

tf <- function(frag) { 

    tidy_html(frag) %>% 
    read_html() %>% 
    html_nodes(xpath="//*[not(self::script)]/text()") %>% 
    html_text() %>% 
    paste0(collapse = " ") %>% 
    gsub("\\n", "", .) %>% 
    gsub("\ +", " ", .) %>% 
    trimws() 

} 

foo <- c("<p>captain <p>tightpants", "<p>malcolm <p>reynolds", "something else") 
lapply(foo, tf) 
## [[1]] 
## [1] "captain tightpants" 
## 
## [[2]] 
## [1] "malcolm reynolds" 
## 
## [[3]] 
## [1] "something else" 

をあなたがしている場合テキストが「クリーン」(すなわち、<script>タグなし)であることを確認したら、セレクタ"//*/text()"を作成することができます。

けれども、私もお勧めかもしれません:

library(purrr) 

map_chr(foo, tf) 
## [1] "captain tightpants" "malcolm reynolds" "something else" 

それがリスト対文字ベクトルを返しますとおり。

+0

提案していただきありがとうございます!私はそれらを試してみる。 –

関連する問題