抓取Javascript生成的HTML表时出现的奇怪字符

抓取Javascript生成的HTML表时出现的奇怪字符,javascript,r,web-scraping,encoding,Javascript,R,Web Scraping,Encoding,我正试着从中搜集一些数据 特别是,我对源代码中的“锦标赛页面数据结果”div感兴趣。当我调出数据时,它确实出现在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/aus

我正试着从中搜集一些数据

特别是,我对源代码中的“锦标赛页面数据结果”div感兴趣。当我调出数据时,它确实出现在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

正如人们在评论中提到的,这不是编码问题。div的文本内容是用一种由javascript解释的表标记语言编写的

您可以对解析器进行反向工程。首先,每个匹配项由一个波浪号(~)字符分割,数据字段由“,”字符分割。每个字段都以键值对的形式由“÷”分割

将其转换为数据帧并不容易,因为数据不是矩形的。转换为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
”https://www.flashscore.com/tennis/atp-singles/australian-open-2020/results/" %>%
xml2::read_html()%>%
rvest::html_节点(“#比赛页面数据结果”)%>%
rvest::html_text()%%>%strsplit(“[~]”)%%>%unlist()%%>%strsplit(“\u00ac”)%%>%
lappy(函数(x)gsub(“^.*\u00f7”,”,x))%>%
lappy(函数(x){
y%
lappy(函数(x)grep(“[a-z]”,x,value=TRUE)[-c(2,4,6,8)])%>%
`[`(-(1:2)) %>%
{do.call(rbind,)}%>%
as.data.frame(stringsAsFactors=FALSE)%>%
`姓名%
tibble::as.tibble()
#>#A tibble:127 x 4
#>日期舞台播放机1播放机2
#>                                                      
#>1 2020-02-02 07:45:00最终德约科维奇北(Srb)蒂姆D(Aut)
#>2 2020-01-31 07:45:00半决赛赛姆D(Aut)兹韦雷夫A(Ger)
#>3 2020-01-30 07:45:00半决赛费德勒(苏)德约科维奇(Srb)
#>4 2020-01-29 07:45:00四分之一决赛泰姆D(Aut)纳达尔R(Esp)
#>5 2020-01-29 02:45:00四分之一决赛瓦林卡(瑞士)兹韦雷夫(德国)
#>6 2020-01-28 07:50:00四分之一决赛拉奥尼克·M·肯·德约科维奇·N·R·B
#>7 2020-01-28 03:15:00四分之一决赛桑德格伦T(美国)费德勒(瑞士)
#>8 2020-01-27 08:05:00 1/8决赛鲁布列夫A.(俄罗斯)兹韦列夫A.(德国)
#>9 2020-01-27 07:15:00 1/8决赛纳达尔河(Esp)基尔吉奥斯北(澳大利亚)
#>10 2020-01-27 03:15:00梅德韦杰夫D.(俄罗斯)瓦林卡S.(瑞士)
#>#……还有117行

我不知道您的
R(rvest套餐)
或Python。如果您对
节点
感到满意,那么有一个包
cheerio
,它有助于在不打开浏览器页面的情况下进行网页抓取。使用它,您将获得所有HTML源代码。看起来,带有奇数字符的源代码实际上是创建页面的脚本的一部分,而不是而不是显示页面本身的HTML。您可能可以手动取消点击,否则您可以使用类似于
RSelenium
的东西通过自动浏览器捕获页面。div锦标赛页面数据结果中的数据内容看起来像某种模糊。可能是故意的?但这是一种疯狂的模式。I如果你搜索“AB÷3÷CR÷3÷AC÷3÷CX÷”(查看源代码),你将在玩家面前获得124次点击。我猜javascript会在运行时将数据转换为有效的html。我不知道你是如何抓取的,但有了JS支持,内容会放在