使用R处理网页提取文本:如何移除难以清除的末尾空白?
解决参考文献末尾空白残留的问题
问题分析
你当前的代码中,gsub("\\s|\n", " ", .)只会替换单个空白/换行,无法处理连续的空白字符,而且可能存在不可见的Unicode空白字符(比如非断空格 U+00A0),这些是trimws默认参数没覆盖到的,导致末尾空白残留。
改进方案
方案1:优化正则表达式,覆盖连续空白与Unicode空白
修改你的代码,把连续空白合并为单个,同时在trimws中加入Unicode空白的匹配:
library(dplyr) library(rvest) url <- "http://www.scielo.org.mx/scielo.php?script=sci_arttext&pid=S1607-40412016000100014&lang=es" page <- read_html(url) referenes_cleaned <- page %>% html_elements("p") %>% .[grepl("(Links)|(doi:)", as.character(.))] %>% html_text() %>% # 移除换行、制表符等控制字符 gsub("[\n\t\b]", "", .) %>% # 移除Links标记 gsub("\\[.*Links.*\\]", "", .) %>% # 把所有连续空白(包括普通空格、Unicode非断空格)替换为单个空格 gsub("[\\s\\u00A0]+", " ", .) %>% # 清理首尾所有类型的空白 trimws("both", whitespace = "[\\s\\u00A0\r\n\b]") referenes_cleaned
方案2:使用stringr包的str_squish简化操作
stringr::str_squish会自动移除所有开头/结尾的空白,并将中间的连续空白合并为单个,还能处理Unicode空白,代码更简洁:
library(dplyr) library(rvest) library(stringr) url <- "http://www.scielo.org.mx/scielo.php?script=sci_arttext&pid=S1607-40412016000100014&lang=es" page <- read_html(url) referenes_cleaned <- page %>% html_elements("p") %>% .[grepl("(Links)|(doi:)", as.character(.))] %>% html_text() %>% gsub("[\n\t\b]", "", .) %>% gsub("\\[.*Links.*\\]", "", .) %>% # 一步完成空白清理 str_squish() referenes_cleaned
关键说明
\\s+匹配一个或多个连续空白,替换为单个空格,避免中间出现冗余空格\\u00A0是常见的非断空格,很多网页会用它来排版,默认的trimws不会处理这个字符str_squish是stringr包的便捷函数,底层已经处理了各种空白类型,推荐使用
内容的提问来源于stack exchange,提问作者Armando González Díaz
相关产品推荐
相关产品推荐

