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

String 从R中的字符串中删除html标记,string,r,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

我试图将网页源代码读入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)
};

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

首先,你的主题行有误导性;您发布的字符串中没有反斜杠。你已经成为一个典型错误的受害者:没有卷入亚洲的陆地战争那么糟糕,但仍然值得注意。您错误地将R使用
\
表示转义字符作为文字反斜杠。在本例中,
\“
表示双引号,而不是两个文字字符
\
。您可以使用
cat
查看如果按字面处理转义字符,字符串的实际外观

其次,您使用正则表达式来解析HTML。(它们不会出现在您的代码中,但它们在
str_locate_all
str_replace_all
的引擎盖下使用)这是另一个经典错误;有关更多说明,请参阅


第三,您应该在帖子中提到您正在使用
stringr
包,但相比之下,这只是一个小错误。

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

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

cleanFun使用qdap包的方法:

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

## > bracketX(test, "angle")
## [1] "junk junk junk junk"

使用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"
>测试gsub(模式=”,替换=”,x=测试)
[1] “垃圾”

最好不要使用正则表达式解析html

使用类似于
XML
的包。使用例如
htmlParse
解析html代码,并使用XPath查找与您相关的数量

更新:

回答OP的问题

require(XML)
xData <- htmlParse('yourfile.html')
xpathSApply(xData, 'appropriate xpath', xmlValue)
require(XML)

扩展数据另一种方法,使用
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"
>库(tm.plugin.webmining)
>extractHTMLStrip(“垃圾”)
[1] “垃圾”

您还可以使用软件包中的两个功能来完成此操作:

库(rvest)

strip_html strip_html(“垃圾邮件”。

编辑以修复输入代码时出现的一些错误。这里有很多事情……首先,这是R,所以没有
。您基本上是在寻找
gsub
和适当的正则表达式(在本例中,这里已经回答了:)。代码还有其他问题(
dim(tagLoc)[1] 
没有做你认为应该做的事情),但我不认为这是你问题的重点基本上它做什么,它在
htmlString中找到任何模式的实例,并用空字符串替换它“
”,并返回结果。对于模式匹配,您应该学习正则表达式。唯一稍微棘手的部分是
“*?”
使其不贪婪,因此如果您有多个标记,例如“垃圾”,它将匹配“”和“”,而不是整个字符串。“每次你试图用正则表达式解析HTML时,邪恶的孩子都会流下处女的血,而俄罗斯黑客会从你的Web应用程序中”很好,我会咬-删除!=Parsing这在这种情况下适用吗?他根本不想解析标签,他想去掉它们。OP可能只是想使用
xpathsaply(doc,'somepath',xmlValue)
。当有人建议使用regex进行HTML时,您经常会提供链接,但这实际上只是一个指导原则,而不是规则。我同意XML(等等)如果可能的话应该使用,但有时不可能或不切实际。仅仅考虑
HTML+regex=bad
是在避免决策。有时regex是合适的。我们不知道数据格式或来源。这被投票了2次,但实际上并没有给OP一个答案。OP没有给出关于他们使用什么的详细信息他们非常想要。他们提供了一个简单的草图,以正则表达式的外观作为解析器。如果不告诉OP这是一个非常常见(如果不是总是一个坏主意的话)的话,那将是错误的。我已经安装了您的包,并查看了各种函数的源代码。
bracketX
对于更一般的应用非常有用问题类别。工具箱的另一个问题。1此代码的问题可能是,它将从第一次出现的
替换为最后一次出现的
。因此,当有多个html标记时,这可能是一个问题注:此库需要Java,这可能是各种R服务器环境中的一个限制输入字符串必须包含一些html标记,否则read_html会将参数视为本地文件路径
html_文本(read_html(charToRaw))
应该可以解决这个问题。我再怎么强调@Motin的注释和patr1ckm的答案都不为过。这是一个奇怪的错误。
require(XML)
xData <- htmlParse('yourfile.html')
xpathSApply(xData, 'appropriate xpath', xmlValue)
> library(tm.plugin.webmining)
> extractHTMLStrip("junk junk<a href=\"/wiki/abstraction_(mathematics)\" title=\"abstraction (mathematics)\"> junk junk")
[1] "junk junk junk junk"
library(rvest)

strip_html <- function(s) {
    html_text(read_html(s))
}
> strip_html("junk junk<a href=\"/wiki/abstraction_(mathematics)\" title=\"abstraction (mathematics)\"> junk junk")
[1] "junk junk junk junk"