2017-07-11 3 views
0

でウェブから抽出された文字列のstringrからstr_extractの予期しない動作:R: <p></p>が、私は人の身長を抽出するための簡単な正規表現パターンを持っている:私はこれは非常に奇妙な例である知っているが、それ<em>が</em>再現性があるrvest

それが動作する単純な文字列でテスト
pattern <- "1\\.[0-9]{2} m" 

library(stringr) 
str_extract("1.75 m", pattern) 
[1] "1.75 m" 

しかし、それは私がウィキペディアからこすり文字列では動作しません。 、rvestからhtml_textを使用して、リンダ・エヴァンジェリスタの高さを抽出するために言う:あなたが密接に見れば

library(rvest) 
url <- "https://en.wikipedia.org/wiki/Linda_Evangelista" 
text <- read_html(url) %>% 
    html_nodes(".infobox") %>% 
    html_text() 
text 
[1] "Linda Evangelista\n\nEvangelista in August 2004\n\nBorn\n(1965-05-10) May 10, 1965 (age 52)St. Catharines, Ontario, Canada\nOccupation\nModel\nYears active\n1984–1998 (retired)\n2001–present\nSpouse(s)\nGérald Marie\n(m. 1987; div. 1993)\nChildren\n1\nModeling information\nHeight\n5 ft 9 in (1.75 m)[1]\nHair color\nBrown\nEye color\nBlue-green\nManager\nDNA Model Management (New York)Models 1 (London)\nView Management (Barcelona)\nPriscilla's Model Management (Sydney)\n\n" 

str_extract(text, pattern) 
[1] NA 

ものの、"1.75 m"文字列があります。

私は手動で予想通りstr_extract作品、新しい変数に上記の文字列をコピー&ペースト場合、確かに:

class(text) 
[1] "character" 
typeof(text) 
[1] "character" 
class(text_manual) 
[1] "character" 
typeof(text_manual) 
[1] "character" 
:両方text変数は、単純な文字列である

text_manual <- "Linda Evangelista\n\nEvangelista in August 2004\n\nBorn\n(1965-05-10) May 10, 1965 (age 52)St. Catharines, Ontario, Canada\nOccupation\nModel\nYears active\n1984–1998 (retired)\n2001–present\nSpouse(s)\nGérald Marie\n(m. 1987; div. 1993)\nChildren\n1\nModeling information\nHeight\n5 ft 9 in (1.75 m)[1]\nHair color\nBrown\nEye color\nBlue-green\nManager\nDNA Model Management (New York)Models 1 (London)\nView Management (Barcelona)\nPriscilla's Model Management (Sydney)\n\n" 
str_extract(text_manual, pattern) 
[1] "1.75 m" 

注意

しかし、それらは同じですか?いいえ:

text == text_manual 
[1] FALSE 

彼らは第83回の文字に異なるように見える:

str_sub(text, 1, 83) 
[1] "Linda Evangelista\n\nEvangelista in August 2004\n\nBorn\n(1965-05-10) May 10, 1965 (age " 
str_sub(text_manual, 1, 83) 
[1] "Linda Evangelista\n\nEvangelista in August 2004\n\nBorn\n(1965-05-10) May 10, 1965 (age " 

str_sub(text, 1, 82) == str_sub(text_manual, 1, 82) 
[1] TRUE 
str_sub(text, 1, 83) == str_sub(text_manual, 1, 83) 
[1] FALSE 

しかし、私は、彼らが同じように表示されます理由はわかりません、その最後の文字は、両方のスペースではありません

Githubのstringrパッケージの問題を開こうと思ったが、それがstringrrvestのどちらであるかわからない。

誰でも何が問題なのでしょうか?それらが異なって符号化されているので

答えて

3

2つの文字列が異なります

Encoding(text) 
#> [1] "UTF-8" 
Encoding(text_manual) 
#> [1] "latin1" 

utf8ToInt(str_sub(text, 83, 83)) 
#> [1] 160 
utf8ToInt(str_sub(text_manual, 83, 83)) 
#> [1] 32 

intToUtf8(utf8ToInt(str_sub(text, 83, 83))) 
#> [1] " " 
intToUtf8(utf8ToInt(str_sub(text_manual, 83, 83))) 
#> [1] " " 

Encoding(text_manual)のためのあなたの結果はあなたのロケールに基づいて変更される可能性があることに注意してください)

reg-expにしてこの問題を利用\sを避けるために任意の空白文字に一致:

library(rvest) 
library(stringr) 
url <- "https://en.wikipedia.org/wiki/Linda_Evangelista" 
text <- read_html(url) %>% 
    html_nodes(".infobox") %>% 
    html_text() 

pattern <- "1\\.[0-9]{2}\\sm" 

str_extract(text, pattern) 
#> [1] "1.75 m" 
+0

あなたはそれを釘付けました。 –

関連する問題