34

WebページのソースをRに読み込んで文字列として処理しようとしています。段落を取り出して、段落テキストから html タグを削除しようとしています。次の問題が発生しています。

HTMLタグを削除する関数を実装してみました:

cleanFun=function(fullStr)
{
 #find location of tags and citations
 tagLoc=cbind(str_locate_all(fullStr,"<")[[1]][,2],str_locate_all(fullStr,">")[[1]][,1]);

 #create storage for tag strings
 tagStrings=list()

 #extract and store tag strings
 for(i in 1:dim(tagLoc)[1])
 {
   tagStrings[i]=substr(fullStr,tagLoc[i,1],tagLoc[i,2]);
 }

 #remove tag strings from paragraph
 newStr=fullStr
 for(i in 1:length(tagStrings))
 {
   newStr=str_replace_all(newStr,tagStrings[[i]][1],"")
 }
 return(newStr)
};

これは一部のタグでは機能しますが、すべてのタグでは機能しません。これが失敗する例は、次の文字列です。

test="junk junk<a href=\"/wiki/abstraction_(mathematics)\" title=\"abstraction (mathematics)\"> junk junk"

目標は、次のものを取得することです。

cleanFun(test)="junk junk junk junk"

ただし、これは機能しないようです。文字列の長さやエスケープ文字が関係しているのではないかと思ったのですが、解決策が見つかりませんでした。

4

7 に答える 7

74

これは、正規表現と grep ファミリーを使用して簡単に実現できます。

cleanFun <- function(htmlString) {
  return(gsub("<.*?>", "", htmlString))
}

これは、同じ文字列内の複数の html タグでも機能します!

これにより<.*?>、htmlString 内のパターンのインスタンスが検出され、空の文字列 "" に置き換えられます。? in.*?は貪欲ではないので、複数のタグ ( など) がある場合、文字列全体ではなくandに<a> junk </a>一致します。<a></a>

于 2013-06-21T03:49:30.773 に答える
10

内部tm.plugin.webminingで使用する を使用した別のアプローチ。XML

> library(tm.plugin.webmining)
> extractHTMLStrip("junk junk<a href=\"/wiki/abstraction_(mathematics)\" title=\"abstraction (mathematics)\"> junk junk")
[1] "junk junk junk junk"
于 2013-06-21T14:54:43.987 に答える
7

qdap パッケージを使用したアプローチ:

library(qdap)
bracketX(test, "angle")

## > bracketX(test, "angle")
## [1] "junk junk junk junk"
于 2013-06-21T04:24:06.653 に答える
3

sub または gsub を使用すると簡単ですか?

> test  <- "junk junk<a href=\"/wiki/abstraction_(mathematics)\" title=\"abstraction (mathematics)\"> junk junk"
> gsub(pattern = "<.*>", replacement = "", x = test)
[1] "junk junk junk junk"
于 2013-06-21T04:31:32.293 に答える
2

まず、件名が誤解を招きます。投稿した文字列にバックスラッシュはありません。あなたは典型的な失策の 1 つに陥ってしまいました。アジアで陸戦に巻き込まれるほどではありませんが、それでも注目に値します。\リテラルのバックスラッシュのエスケープ文字を示すR の使用を間違えています。この場合、は 2 つのリテラル文字と\"ではなく、二重引用符を意味します。エスケープ文字が文字どおりに処理された場合、文字列が実際にどのように見えるかを確認するために使用できます。\"cat

次に、正規表現を使用して HTML を解析しています。(これらはコードには表示されませんが、 および の内部で使用されstr_locate_allますstr_replace_all。) これはもう 1 つの古典的な失敗です。詳細については、こちらを参照してください。

第 3 に、パッケージを使用していることを投稿で言及する必要がありましたstringrが、比較すると、これは小さな失敗にすぎません。

于 2013-06-21T03:48:39.517 に答える