Странные символы при очистке HTML таблиц, сгенерированных Javascript - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь почистить некоторые данные из https://www.flashscore.com/tennis/atp-singles/australian-open-2020/results/

В частности, меня интересует div "router-page-data-results" в исходном коде , Данные появляются в исходном коде HTML, когда я их поднимаю, но это выглядит примерно так:

"SA÷2¬~ZA÷ATP - SINGLES: Australian Open (Australia), hard¬ZEE÷MP4jLdJh¬ZB÷3473162¬ZC÷n5bYULYo¬ZD÷p¬ZE÷6N6d2yER¬ZF÷0¬ZO÷0¬ZG÷2¬ZH÷9011_MP4jLdJh¬ZJ÷5¬ZL÷/tennis/atp-singles/australian-open/¬ZX÷01110...000Australian O021, hard00000000Australian O027ralia)¬ZHS÷5724¬ZCC÷0¬ZAF÷ATP - Singles¬~AA÷WEJGUHfb¬AD÷1580633100¬ADE÷1580633100¬AB÷3¬CR÷3¬AC÷3¬CX÷Thiem 

с реальными данными, смешанными со случайными символами. Я пытался конвертировать из 'utf-8' в 'ascii', но у него та же проблема только с разными случайными символами.

Какая мне нужна правильная кодировка? Или вообще есть другой подход? Я перебираю R (пакет rvest), чтобы не открывать каждую страницу в окне браузера. Я могу переключиться на Python, если это проще.

1 Ответ

1 голос
/ 15 февраля 2020

Как уже упоминалось в комментариях, это не проблема кодирования. Текстовое содержимое div написано на языке разметки таблиц, который интерпретируется как javascript.

Вы можете перепроектировать парсер. Для начала каждое совпадение разделяется символом тильды (~), а поля данных - символом ¬. Каждое поле имеет форму пары ключ-значение, разделенной на «÷».

Нелегко преобразовать это во фрейм данных, поскольку данные не являются прямыми angular. Было бы проще преобразовать в JSON.

Вот пример того, как получить некоторые из областей интереса:

"https://www.flashscore.com/tennis/atp-singles/australian-open-2020/results/" %>%
  xml2::read_html() %>% 
  rvest::html_node("#tournament-page-data-results") %>% 
  rvest::html_text() %>% strsplit("[~]") %>% unlist() %>% strsplit("\u00ac") %>%
  lapply(function(x) gsub("^.*\u00f7", "", x)) %>%
  lapply(function(x){
    y <- as.numeric(grep("\\d{10}", x, value = TRUE))
    y <- as.difftime(y, units = "secs") + as.POSIXct("1970-01-01 00:00:00")
    x[grep("\\d{10}", x)] <- as.character(y)
    return(x)}) %>% 
  lapply(`[`, -(1:2)) %>% 
  lapply(function(x) x[!grepl("^[[:alnum:]]{8}$", x)]) %>%
  lapply(function(x) grep("[a-z ]", x, value = TRUE)[-c(2,4,6,8)]) %>%
  `[`(-(1:2)) %>%
  {do.call(rbind, .)} %>%
  as.data.frame(stringsAsFactors = FALSE) %>%
  `names<-`(c("Date", "Stage", "Player1", "Player2")) %>%
  tibble::as.tibble()
#> # A tibble: 127 x 4
#>    Date                Stage          Player1           Player2          
#>    <chr>               <chr>          <chr>             <chr>            
#>  1 2020-02-02 07:45:00 Final          Djokovic N. (Srb) Thiem D. (Aut)   
#>  2 2020-01-31 07:45:00 Semi-finals    Thiem D. (Aut)    Zverev A. (Ger)  
#>  3 2020-01-30 07:45:00 Semi-finals    Federer R. (Sui)  Djokovic N. (Srb)
#>  4 2020-01-29 07:45:00 Quarter-finals Thiem D. (Aut)    Nadal R. (Esp)   
#>  5 2020-01-29 02:45:00 Quarter-finals Wawrinka S. (Sui) Zverev A. (Ger)  
#>  6 2020-01-28 07:50:00 Quarter-finals Raonic M. (Can)   Djokovic N. (Srb)
#>  7 2020-01-28 03:15:00 Quarter-finals Sandgren T. (Usa) Federer R. (Sui) 
#>  8 2020-01-27 08:05:00 1/8-finals     Rublev A. (Rus)   Zverev A. (Ger)  
#>  9 2020-01-27 07:15:00 1/8-finals     Nadal R. (Esp)    Kyrgios N. (Aus) 
#> 10 2020-01-27 03:15:00 1/8-finals     Medvedev D. (Rus) Wawrinka S. (Sui)
#> # ... with 117 more rows
...