разбор html, содержащего (неразрывный пробел)

Я использую 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)

person AndrewMacDonald    schedule 01.12.2014    source источник


Ответы (6)


Джейдхаррисон ответил:

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

и это будет работать, но вы можете использовать:

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

который удалит все Space characters: tab, newline, vertical tab, form feed, carriage return, space and possibly other locale-dependent characters. Это очень удобочитаемая альтернатива другим загадочным классам регулярных выражений.

person hrbrmstr    schedule 01.12.2014
comment
К сожалению, это последнее решение, каким бы читабельным оно ни было, не работает. Проблема, похоже, связана с кодировкой (см. мой комментарий к @MrFlick) - person AndrewMacDonald; 02.12.2014
comment
Однако техника \\W РАБОТАЕТ! Таким образом, очевидно, что бы это пространство ни было закодировано, как в моей локали, это НЕ слово! - person AndrewMacDonald; 02.12.2014
comment
не отмечен, потому что, хотя это работает, удаление символов, не являющихся словами, слишком экстремально для моего приложения, и я все еще очень хочу знать, как сопоставить это пространство! - person AndrewMacDonald; 02.12.2014

Я столкнулся с той же проблемой и остановился на простой замене

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

(Отредактировано для правильного регистра.)

person shabbychef    schedule 30.09.2015

&nbsp означает «неразрывный пробел», который в пространстве Юникода имеет свой собственный символ, отличный от «обычного» пробела (т.е. " "). Сравнивать

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)
person MrFlick    schedule 01.12.2014
comment
эта функция charToRaw прекрасна! Итак, я действительно пробовал что-то подобное. Согласно этому ответу, &nbsp; интерпретируется как Â и . Проблема в том, что хотя я мог бы сопоставить Â с регулярным выражением, я не могу сделать это с пробелом. Ваш трюк с кодировкой не помог. Простите меня за то, что я не воспроизвел эту работу здесь; Я не смог воспроизвести Â в моем примере - person AndrewMacDonald; 02.12.2014
comment
Вы увидите Â, если у вас не правильно установлена ​​кодировка для переменной. Что вы получите, если сделаете Encoding(bodytext)? Вы также можете безопасно установить его на latin1 - person MrFlick; 02.12.2014
comment
Encoding(bodytext) возвращает UTF-8, но то, что выглядит как пробел, не может быть сопоставлено ни одним выражением, нацеленным на пробелы, ни \\s, ни [:space:] - person AndrewMacDonald; 02.12.2014
comment
Вы должны изменить свой вопрос, включив в него результаты sessionInfo(), которые должны иметь версию R и версию ОС. То есть вы говорите, что не видите Â, видите пробел, но \\s ему не соответствует? А вы тестируете на примере в исходном посте? И вы получаете те же значения charToRaw(), что и я? - person MrFlick; 02.12.2014

Публикую это, так как считаю, что это самый надежный подход.

Я очистил страницу Википедии и получил это в своем выводе (не уверен, что он будет правильно копировать и вставлять):

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; этот подход можно обобщить на другие подобные ситуации)

person MichaelChirico    schedule 24.02.2016

Использование rex может немного упростить эту задачу. Также я не могу воспроизвести ваши проблемы с кодировкой, следующее правильно заменяет пробел независимо от кодировки на моей машине. (Это то же решение, что и [[:space:]], поэтому, вероятно, у вас та же проблема)

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

#> [1] "foo"
person Jim    schedule 04.12.2014

Мне удалось удалить &nbsp; пробелов в начале и конце строк с помощью mystring %>% stringr::str_trim().

person jtr13    schedule 25.07.2017