使用 stringr 解析网页
Parsing a web page with stringr
我有这个项目,我试图从网页中提取数字。下面是我尝试解析的文本示例。
"\naAreas =
[\n[107447478,2490,1925,559,1016,962,0,18,0,1,110,],\n[107447440,2366,1800,565,1033,811,1,46,0,0,23,],\n[107447521,2933,2396,543,921,1566,0,11,0,0,115,]\n];\naRoutes
= [\n];\n$(function() {\n $(\".typeTip\").attr(\"title\", \"T=Trad, S=Sport, TR=Toprope\");\n showTips();\n});\n"
我要查找粗体数字,所以“\n[”和“,”之间的任何数字。我正在尝试使用 R 中的 stringr 包来执行此操作,但我对正则表达式并不是很熟悉,所以我要删除了。
这个有效:
x <- "\naAreas = [\n[107447478,2490,1925,559,1016,962,0,18,0,1,110,],\n[107447440,2366,1800,565,1033,811,1,46,0,0,23,],\n[107447521,2933,2396,543,921,1566,0,11,0,0,115,]\n];\naRoutes = [\n];\n$(function() {\n $(\".typeTip\").attr(\"title\", \"T=Trad, S=Sport, TR=Toprope\");\n showTips();\n});\n"
stringr::str_extract_all(x, '(?<=\n\[)\d+')
## [[1]]
## [1] "107447478" "107447440" "107447521"
(?<=\n\[)
是一个回顾,并说确保继续进行新行和方括号,但不要捕获它们。 \d+
表示尽可能多地获取数字,直到没有更多数字为止。
如果你只想捕获数字,你可以试试这个:
(?:\n\[)(\d+)
stringr
基于 stringi
。这是使用 stringi
和 V8
的不同方法,因为你在那里有 javascript:
library(V8)
library(stringi)
js <- "\naAreas = [\n[107447478,2490,1925,559,1016,962,0,18,0,1,110,],\n[107447440,2366,1800,565,1033,811,1,46,0,0,23,],\n[107447521,2933,2396,543,921,1566,0,11,0,0,115,]\n];\naRoutes = [\n];\n$(function() {\n $(\".typeTip\").attr(\"title\", \"T=Trad, S=Sport, TR=Toprope\");\n showTips();\n});\n"
ctx <- v8()
我们必须删除 jQuery 位,因为 V8 无法处理这些位,但是一旦我们这样做了,我们就可以将其计算为 javascript:
ctx$eval(sprintf("var %s ", paste0(stri_split_lines(js)[[1]][2:6], collapse="\n")))
然后获取数据:
ctx$get("aAreas")
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
## [1,] 107447478 2490 1925 559 1016 962 0 18 0 1 110
## [2,] 107447440 2366 1800 565 1033 811 1 46 0 0 23
## [3,] 107447521 2933 2396 543 921 1566 0 11 0 0 115
或者,只是我们想要的位:
ctx$get("aAreas")[,1]
## [1] 107447478 107447440 107447521
我有这个项目,我试图从网页中提取数字。下面是我尝试解析的文本示例。
"\naAreas = [\n[107447478,2490,1925,559,1016,962,0,18,0,1,110,],\n[107447440,2366,1800,565,1033,811,1,46,0,0,23,],\n[107447521,2933,2396,543,921,1566,0,11,0,0,115,]\n];\naRoutes = [\n];\n$(function() {\n $(\".typeTip\").attr(\"title\", \"T=Trad, S=Sport, TR=Toprope\");\n showTips();\n});\n"
我要查找粗体数字,所以“\n[”和“,”之间的任何数字。我正在尝试使用 R 中的 stringr 包来执行此操作,但我对正则表达式并不是很熟悉,所以我要删除了。
这个有效:
x <- "\naAreas = [\n[107447478,2490,1925,559,1016,962,0,18,0,1,110,],\n[107447440,2366,1800,565,1033,811,1,46,0,0,23,],\n[107447521,2933,2396,543,921,1566,0,11,0,0,115,]\n];\naRoutes = [\n];\n$(function() {\n $(\".typeTip\").attr(\"title\", \"T=Trad, S=Sport, TR=Toprope\");\n showTips();\n});\n"
stringr::str_extract_all(x, '(?<=\n\[)\d+')
## [[1]]
## [1] "107447478" "107447440" "107447521"
(?<=\n\[)
是一个回顾,并说确保继续进行新行和方括号,但不要捕获它们。 \d+
表示尽可能多地获取数字,直到没有更多数字为止。
如果你只想捕获数字,你可以试试这个:
(?:\n\[)(\d+)
stringr
基于 stringi
。这是使用 stringi
和 V8
的不同方法,因为你在那里有 javascript:
library(V8)
library(stringi)
js <- "\naAreas = [\n[107447478,2490,1925,559,1016,962,0,18,0,1,110,],\n[107447440,2366,1800,565,1033,811,1,46,0,0,23,],\n[107447521,2933,2396,543,921,1566,0,11,0,0,115,]\n];\naRoutes = [\n];\n$(function() {\n $(\".typeTip\").attr(\"title\", \"T=Trad, S=Sport, TR=Toprope\");\n showTips();\n});\n"
ctx <- v8()
我们必须删除 jQuery 位,因为 V8 无法处理这些位,但是一旦我们这样做了,我们就可以将其计算为 javascript:
ctx$eval(sprintf("var %s ", paste0(stri_split_lines(js)[[1]][2:6], collapse="\n")))
然后获取数据:
ctx$get("aAreas")
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
## [1,] 107447478 2490 1925 559 1016 962 0 18 0 1 110
## [2,] 107447440 2366 1800 565 1033 811 1 46 0 0 23
## [3,] 107447521 2933 2396 543 921 1566 0 11 0 0 115
或者,只是我们想要的位:
ctx$get("aAreas")[,1]
## [1] 107447478 107447440 107447521