【问题标题】:Mangling of French unicode when webscraping with rvest使用 rvest 进行网页抓取时法语 unicode 的混乱
【发布时间】:2018-05-20 12:37:42
【问题描述】:

我正在考虑使用 rvest 包抓取一个法语网站。

library(rvest)
url <- "https://www.vins-bourgogne.fr/nos-vins-nos-terroirs/tous-les-bourgognes/toutes-les-appellations-de-bourgogne-a-votre-portee,2378,9172.html?&args=Y29tcF9pZD0xMzg2JmFjdGlvbj12aWV3RnVsbExpc3RlJmlkPSZ8"
s <- read_html(url)
s %>% html_nodes('#resultatListeAppellation .lien') %>% html_text()

我希望看到:

Aloxe-Corton (Appellation Village, VIGNOBLE DE LA CÔTE DE BEAUNE)
Auxey-Duresses (Appellation Village, VIGNOBLE DE LA CÔTE DE BEAUNE)
Bâtard-Montrachet (Appellation Grand Cru, VIGNOBLE DE LA CÔTE DE BEAUNE)

相反,我看到变音符号被破坏(见下面的第 3 行):

"Aloxe-Corton (Appellation Village, VIGNOBLE DE LA CÃ\u0094TE DE BEAUNE)"        
"Auxey-Duresses (Appellation Village, VIGNOBLE DE LA CÃ\u0094TE DE BEAUNE)"      
"Bâtard-Montrachet (Appellation Grand Cru, VIGNOBLE DE LA CÃ\u0094TE DE BEAUNE)"

页面的源 html 显示它是用 utf-8 编码的。在 html_text() 上使用guess_encoding(),它也建议使用 utf-8(1.00 置信度),或者 windows-1252 的置信度为 0.73。将编码更改为 windows-1252 无济于事:

"Aloxe-Corton (Appellation Village, VIGNOBLE DE LA CÔTE DE BEAUNE)"                                                                                
"Auxey-Duresses (Appellation Village, VIGNOBLE DE LA CÔTE DE BEAUNE)"                                                                              
"Bâtard-Montrachet (Appellation Grand Cru, VIGNOBLE DE LA CÔTE DE BEAUNE)"

我在不同的法语网站上尝试了相同的代码(也编码为 utf-8):

x <- read_html('http://www.lemonde.fr/disparitions/article/2017/12/06/johnny-hallyday-c-etait-notre-seule-rock-star-la-france-perd-son-icone-du-rock_5225507_3382.html')
x %>% html_nodes('.taille_courante+ p , .croix_blanche , .tt2') %>% html_text()

现在我得到了变音符号等:

[1] "Johnny Hallyday : « C’était notre seule rock star », « La France perd son icône du rock »"                                                                                                                                                                                           
[2] "« Comme toute la France, mon cœur est brisé, a déclaré à l’Agence France-Presse (AFP) la chanteuse Sylvie Vartan, qui fut la première épouse de Johnny Hallyday, et mère de leur fils, David, né en 1966. J’ai perdu l’amour de ma jeunesse et rien ne pourra jamais le remplacer. »"

关于我在第一个网站上哪里出错的任何建议?或者如何解决?

【问题讨论】:

    标签: r unicode encoding utf-8 rvest


    【解决方案1】:

    这是一个奇怪的网站。并非都是有效的 UTF-8:

    lines <- readLines(url, warn = FALSE)
    all(utf8::utf8_valid(lines))
    #> [1] FALSE
    

    以下是违规行:

    lines[!utf8::utf8_valid(lines)]
    #> [1] "// on supprime l'\xe9ventuel cookie"                                                                             
    #> [2] "//Ouverture et fermeture de l'encart r\xe9saux sociaux lors d'un clic sur le bouton"                             
    #> [3] "//Cr\xe9ation de l'iframe facebook \xe0 la premi\xe8re ouverture de l'encart pour qu'elle fasse la bonne largeur"
    #> [4] "//fermeture de l'encart r\xe9saux sociaux lors d'un clic ailleurs sur la page"   
    

    这些看起来像 JavaScript 代码中的 cmets。我怀疑read_html 意识到该页面并非都是有效的 UTF-8,并将编码解释为 Windows-1252 或其他一些 8 位编码方案。

    您可以尝试通过删除有问题的 JS 段来解决此问题:

    content <- paste(lines[utf8::utf8_valid(lines)], collapse = "\n")
    content %>% read_html() %>% html_nodes('#resultatListeAppellation .lien') %>% html_text()
    

    这给出了预期的输出。

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 2018-02-15
      • 2018-10-27
      • 2015-09-06
      • 1970-01-01
      相关资源
      最近更新 更多