Rvest输出在其中一个单元格中插入一个长字符串的额外数据:
QC1 <- read_html("https://en.wikipedia.org/wiki/List_of_airports_in_Quebec")%>%
html_node('body #content #bodyContent #mw-content-text .mw-parser-output table') %>%
html_table(fill = TRUE)
QC1$坐标第一个单元格的开头为:.mw解析器输出。geo默认值,.mw解析器输出来。geo dms,.mw语法分析器输出。geo-dec{display:inline}。mw语法分析器输出来。geo非默认值,.msw语法分析器输出去。geomulti-punct{dispay:none}。mw语法分析器输出。经度,.mw解析程序输出。纬度{white-space:nowrap}60°49′07〃N 078°08′55〃W/60.81861°N 78.14861°W/60.81861-78.14861(阿库利维克机场(
并且所有其他单元格以数字坐标数据开始。我尝试过str_remove,但我发现文档中基于水果的示例有限,在处理比"更复杂的regex时毫无帮助;香蕉";。
我想删除第一个坐标单元格中的所有内容,直到最后一个"}&";。我想我可以用str_remove(., "^.*}")
或gsub添加一个管道,但它没有起作用。有什么建议吗?
您可以使用
library(textreadr)
library(dplyr)
library(rvest)
QC1 <- read_html("https://en.wikipedia.org/wiki/List_of_airports_in_Quebec")%>%
html_node('body #content #bodyContent #mw-content-text .mw-parser-output table') %>%
html_table(fill = TRUE)
QC1$Coordinates <- sub(".*}", "", QC1$Coordinates)
第一项将如预期:
> QC1$Coordinates[1]
[1] "60°49′07″N 078°08′55″W / 60.81861°N 78.14861°W / 60.81861; -78.14861 (Akulivik Airport)"
sub(".*}", "", QC1$Coordinates)
代码行删除直到最后一个}
的所有文本,包括字符。
注意:defaul使用的sub
/gsub
的正则表达式引擎是TRE,该正则表达式引擎不需要转义}
字符,它不是一个特殊的正则表达式元字符。然而,str_remove
需要转义}
,因为stringr
/stringi
函数中使用的正则表达式引擎是ICU,并且该正则表达式引擎与gsub
/sub
等基本R函数中常用的TRE和PCRE都有很大不同。
所以,你也可以使用
str_remove(., "^.*\}")
str_remove(., "(?s)^.*\}") ## If there are line breaks before last }
str_remove(., "^.*[}]") ## Inside brackets, } is not special
我得到了Error in stri_replace_first_regex(string, pattern, fix_replacement(replacement), : Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX)
因为}是一个特殊的字符(感谢LukeA(
因此QC1$Coordinates %<>% str_remove(., pattern="^.*\}")
或QC1$Coordinates %<>% sub(".*}", "", .)
在功能上是等效的(感谢Wiktor的替代方案(。似乎sub()
并没有因为某种原因而与}
发生冲突。