从R中的字符串中删除html标记

Rya*_*ick 23 string r

我正在尝试将网页源读入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)
};
Run Code Online (Sandbox Code Playgroud)

这适用于某些标签,但不适用于所有标签,此失败的示例是跟随字符串:

test="junk junk<a href=\"/wiki/abstraction_(mathematics)\" title=\"abstraction (mathematics)\"> junk junk"
Run Code Online (Sandbox Code Playgroud)

目标是获得:

cleanFun(test)="junk junk junk junk"
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用.我认为它可能与字符串长度或转义字符有关,但我找不到涉及这些的解决方案.

Sco*_*hie 49

这可以通过正则表达式和grep系列来实现:

cleanFun <- function(htmlString) {
  return(gsub("<.*?>", "", htmlString))
}
Run Code Online (Sandbox Code Playgroud)

这也适用于同一个字符串中的多个html标签!

  • 基本上它是什么,它在`htmlString'中找到模式`"<.*?>"的任何实例,并用空字符串`""`替换它,并返回结果.对于模式匹配,您应该学习正则表达式.唯一有点棘手的部分是``.*?'`,```使它不贪心,所以如果你有多个标签,例如"<a>垃圾</a>"它将匹配"<a>"和"</a>"而不是整个字符串. (4认同)
  • 好吧,我会咬–移除!=解析 (3认同)
  • “_每次你尝试用正则表达式解析 HTML 时,邪恶的孩子都会流着处女的血,而俄罗斯黑客会窃取你的 webapp_”来自[这个开创性的答案](/sf/answers/121271811/)。 (2认同)

Dav*_*son 14

您还可以使用rvest包中的两个函数执行此操作:

library(rvest)

strip_html <- function(s) {
    html_text(read_html(s))
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

> strip_html("junk junk<a href=\"/wiki/abstraction_(mathematics)\" title=\"abstraction (mathematics)\"> junk junk")
[1] "junk junk junk junk"
Run Code Online (Sandbox Code Playgroud)

请注意,您不应使用正则表达式来解析HTML.

  • 请注意,输入字符串必须包含一些html标记,否则read_html会将参数视为本地文件路径 (6认同)
  • `html_text(read_html(charToRaw(s)))` 应该可以解决这个问题。 (2认同)

Pey*_*ton 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"
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ker 5

使用qdap包的方法:

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

## > bracketX(test, "angle")
## [1] "junk junk junk junk"
Run Code Online (Sandbox Code Playgroud)

  • 我已经安装了您的软件包并查看了各种功能的源代码。`bracketX` 对于更一般的问题非常有用。另一个用于工具箱。 (2认同)