r - 使用 Rvest 解决纽约时报数独难题
问题描述
我正在尝试抓取NY Times 数独谜题,但是当我使用rvest
它时,它并没有达到我想要的水平。但是,当我使用开发人员工具查看 css 时,所有数据似乎都在那里。看来以下应该工作,
library(rvest)
url <- "https://www.nytimes.com/puzzles/sudoku/easy"
webpage <- read_html(url)
webpage %>%
html_node(".su-stretch")
它返回一个空列表。理想情况下,我想获取每个单元格中的值,但我无法抓取.pz-game-field
节点下方的任何内容。有什么我想念的吗?有没有办法刮掉拼图?
对于那些对我为什么这样做感兴趣的人......我的父母有 ColorKu(颜色而不是数字)并且正在寻找更多的谜题。是的,我可以向他们展示如何自己将数字转换为颜色,但这似乎违反了编码信条......
解决方案
如果您查看该页面的源代码,您会看到该表格是使用 Javascript 呈现的。游戏数据存储在一个变量中,window.gameData
.
所以你可以像这样提取Javascript:
js <- webpage %>%
html_nodes("script") %>%
html_text()
检查显示js[1]
包含游戏的数据。您可以将数据转换为 JSON:
js1 <- gsub("window.gameData = ", "", js[1])
然后转换为列表:
library(jsonlite)
js1 <- fromJSON(js1)
然后,例如,“简单”拼图的单元格值作为向量:
js1$easy$puzzle_data$puzzle
[1] 0 0 4 1 0 0 5 2 7 2 1 3 7 0 0 0 0 0 0 0 7 6 2 4 0 0 0 3 5 0 2 7 0 0 0 0 0 0 0 0 3 0 8 7 5 0 4 0 0 0 6 0 1 3 4 7 2 0 1 0 0 5 0 0 3 1 0 6 2 0 0 9 9 0 0 0 0 0 1 8 0
您可以将网格表示为矩阵:
matrix(js1$easy$puzzle_data$puzzle, nrow = 9, byrow = TRUE)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 0 4 1 0 0 5 2 7
[2,] 2 1 3 7 0 0 0 0 0
[3,] 0 0 7 6 2 4 0 0 0
[4,] 3 5 0 2 7 0 0 0 0
[5,] 0 0 0 0 3 0 8 7 5
[6,] 0 4 0 0 0 6 0 1 3
[7,] 4 7 2 0 1 0 0 5 0
[8,] 0 3 1 0 6 2 0 0 9
[9,] 9 0 0 0 0 0 1 8 0
警告 - 提示和解决方案也存储在数据中!
推荐阅读
- qt - 在 QTreeWidget 中设置编辑器宽度以填充单元格
- javascript - array [4,2,7,1] 创建一个返回 Promise 的函数。Promise 将计算一个数组的总和并在 3 秒后打印出来
- typescript - Typescript/ESLint 错误:无法解析模块“aws-lambda”导入/未解析的路径
- latex - 用箭头连接两张 tikz 图片
- python - 如何通过单击类视图中的按钮来更新 django 模型值
- python - 使用 openCV 的 imshow 显示 DFT 输出的问题
- html - 将更多内容进一步放在我的网站上
- flutter - Flutter Bloc 只为同一个小部件添加事件触发一次,并且不会再次触发
- api - 如何通过 id 使用图形 API 从微软团队中删除用户
- python - 如何更新python gui?