2014-12-01 67 views
8

我使用rvest解析网站。我正在用这些小小的不间断空间撞墙。如何删除在解析的html文档中由 元素创建的空白?解析包含非破坏空间的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) 

回答

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) 
+0

'charToRaw'功能非常棒!好吧,我真的尝试过类似的东西。根据[这个答案](http://stackoverflow.com/questions/4515117/php-parsing-problem-nbsp-and-%C3%82),' '被解释为“”和“”。麻烦的是,虽然我可以将“”与正则表达式匹配,但我无法在空间中这样做。你的编码技巧没有帮助。原谅我不在这里复制这项工作;我无法在我的示例中获取“”以复制 – AndrewMacDonald 2014-12-01 21:21:51

+0

如果您没有在变量上正确设置编码,则会看到“”。如果你使用'Encoding(bodytext)',你会得到什么?您也可以安全地将其设置为“latin1” – MrFlick 2014-12-01 21:25:28

+2

'Encoding(bodytext)'返回'UTF-8',但是作为空格显示的内容不能与任何以空格为目标的表达式匹配,既不是'\\ s'也不是' [:space:]' – AndrewMacDonald 2014-12-01 21:43:28

7

jdharrison回答:

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

,并在此将工作,但你可以使用:

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

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

+2

不幸的是,后面的解决方案,不管可读性,都不起作用。这个问题似乎涉及编码(请参阅我对@MrFlick的评论) – AndrewMacDonald 2014-12-01 21:23:40

+0

但是,'\\ W'技术确实可行!显然,无论我的语言环境如何编码,这不是一个字! – AndrewMacDonald 2014-12-01 21:24:29

+0

未经检查,因为虽然这确实有效,但删除非字符字符对于我的应用程序来说太过于极端了,而且我仍然非常想知道如何匹配此空间! – AndrewMacDonald 2014-12-01 22:00:51

0

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

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

#> [1] "foo" 
7

我遇到了同样的问题,并已对

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

简单的替代解决(编辑纠正案件。)

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;这种方法可以推广到其他类似的情况)

0

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