【问题标题】:parsing html containing   (non-breaking space)解析包含 (不间断空格)的 html
【发布时间】:2014-12-01 21:01:04
【问题描述】:

我正在使用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)

【问题讨论】:

    标签: r stringr


    【解决方案1】:

    jdharison 回答:

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

    而且,这会起作用,但你可以使用:

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

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

    【讨论】:

    • 不幸的是,后一种解决方案,无论多么可读,都不起作用。问题似乎涉及编码(请参阅我对@MrFlick 的评论)
    • 但是,\\W 技术确实有效!所以很明显,无论那个空间在我的语言环境中编码成什么,它都不是一个词!
    • 未选中,因为虽然这确实有效,但删除非单词字符对我的应用程序来说太极端了,我仍然很想知道如何匹配这个空格!
    【解决方案2】:

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

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

    (已修改为正确大小写。)

    【讨论】:

      【解决方案3】:

      &amp;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)
      

      【讨论】:

      • charToRaw 功能太棒了!好的,所以我实际上尝试了类似的东西。根据this answer&amp;nbsp; 被解释为“”和“”。麻烦的是,虽然我可以将“”与正则表达式匹配,但我不能用空格来匹配。你的编码技巧没有帮助。原谅我没有在这里复制这个作品;我无法在我的示例中复制“”
      • 如果您没有在变量上正确设置编码,您将看到“”。如果你做Encoding(bodytext),你会得到什么?您也可以安全地将其设置为“latin1”
      • Encoding(bodytext) 返回UTF-8,但任何以空格为目标的表达式都无法匹配显示为空格的内容,\\s[:space:] 均不匹配
      • 您应该修改您的问题以包含sessionInfo() 的结果,该结果应该具有 R 版本和 OS 版本。所以你说你没有看到“”,你看到一个空格但\\s 不匹配?您正在测试原始帖子中的示例?你得到的 charToRaw() 值和我一样吗?
      【解决方案4】:

      发布这个是因为我认为这是最可靠的方法。

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

      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 从哪里得到160 的输入intToUtf8;这种方法可以推广到其他类似情况)

      【讨论】:

        【解决方案5】:

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

        re_substitutes(bodytext, rex(spaces), "", global = TRUE)
        
        #> [1] "foo"
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-06
            • 2018-12-30
            • 2010-09-10
            • 1970-01-01
            • 2013-01-14
            • 1970-01-01
            • 2012-10-28
            • 1970-01-01
            相关资源
            最近更新 更多