9

rvest用来解析网站。我正在用这些小的非破坏空间撞墙。如何删除 已解析的 html 文档中的元素创建的空白?

library("rvest")
library("stringr")  

minimal <- html("<!doctype html><title>blah</title> <p>&nbsp;foo")

bodytext <- minimal %>%
  html_node("body") %>% 
  html_text

现在我已经提取了正文:

bodytext
[1] " foo"

但是,我无法删除那个讨厌的空格!

str_trim(bodytext)

gsub(pattern = " ", "", bodytext)
4

6 回答 6

9

jdharison 回答:

gsub("\\W", "", bodytext)

并且,这将起作用,但您可以使用:

gsub("[[:space:]]", "", bodytext)

这将删除所有Space characters: tab, newline, vertical tab, form feed, carriage return, space and possibly other locale-dependent characters. 它是其他神秘正则表达式类的非常易读的替代品。

于 2014-12-01T21:20:54.603 回答
8

我遇到了同样的问题,并决定简单替换

gsub(intToUtf8(160),'',bodytext)

(编辑为正确大小写。)

于 2015-09-30T23:42:30.650 回答
3

代表“&nbsp不间断空间”,它在 unicode 空间中具有与“常规”空间(即" ")不同的特征。相比

charToRaw(" foo")
# [1] 20 66 6f 6f
charToRaw(bodytext)
# [1] c2 a0 66 6f 6f

因此,您希望使用一种特殊字符类来表示空白。您可以删除所有空格

gsub("\\s", "", bodytext)

在 Windows 上,我需要确保字符串的编码设置正确

Encoding(bodytext) <- "UTF-8"
gsub("\\s", "", bodytext)
于 2014-12-01T21:10:56.730 回答
2

发布此内容是因为我认为这是最可靠的方法。

我刮了一个维基百科页面,并在我的输出中得到了这个(不确定它是否会正确复制粘贴):

x <- " California"

并且gsub("\\s", "", x)没有改变任何东西,这引发了一些可疑的事情正在发生。

为了调查,我做了:

dput(charToRaw(strsplit(x, "")[[1]][1]))
# as.raw(c(0xc2, 0xa0))

弄清楚该字符在内存中的存储/识别方式。

有了这个,我们可以gsub比其他解决方案更稳健地使用:

gsub(rawToChar(as.raw(c(0xc2, 0xa0))), "", x)
# [1] "California"

(@MrFlick 设置编码的建议对我不起作用,不清楚@shabbychef 从哪里得到输入160intToUtf8这种方法可以推广到其他类似情况)

于 2016-02-24T18:53:46.660 回答
0

使用rex可能会使这种类型的任务更简单一些。此外,我无法重现您的编码问题,无论我的机器上的编码如何,以下内容都会正确替换空间。(这是相同的解决方案[[:space:]],所以可能对您有同样的问题)

re_substitutes(bodytext, rex(spaces), "", global = TRUE)

#> [1] "foo"
于 2014-12-04T13:13:31.410 回答
0

我能够删除&nbsp;字符串开头和结尾的空格mystring %>% stringr::str_trim()

于 2017-07-25T15:38:53.650 回答