【问题标题】:Parsing URL in R to extract specific data在 R 中解析 URL 以提取特定数据
【发布时间】:2020-09-28 11:46:57
【问题描述】:

我有一个数据文件,其中有一个 URL 列。它看起来像这样 "https://www.google.com/ | query_string=utm_source=abc&utm_medium=yts&utm_campaign=123campaign&utm_term=camp%123&utm_content=brand&gclid=abcdefg|user_agent=xyz"

我希望这些数据位于单独的列中,其各自的值如下所示

utm_source utm_medium utm_campaign utm_term utm_content user_agent
abc          yts      123campaign  camp%123   brand         xyz

使用 dput 作为 URL 结果

c("https://www.google.com/ | query_string=null | ip_address=123.113.64.211 | user_agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36","https://www.google.com/ | query_string=gclid=Lxi6sNo-A17RohDAcQgvD_fw4 | ip_address=167.11.116.237 | user_agent=Mozilla/5.0 (Linux; Android 8.0.0; SM-C701F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36","http://m.facebook.com/ | query_string=utm_source=fb&utm_medium=ctw&utm_campaign=abcPant_rem&utm_content=PantShirt | ip_address=106.193.181.252 | user_agent=Mozilla/5.0 (Linux; Android 10; SM-G975F Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/81.0.4044.138 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/218.0.0.32.158;]")

【问题讨论】:

  • 您确定您提供的链接有效吗?
  • 不,这只是一个示例..但结构就是这样

标签: r urlparse url-parsing


【解决方案1】:

这是使用提供的 URL 的正则表达式解决方案。

url <- "https://www.google.com/ | query_string=utm_source=abc&utm_medium=yts&utm_campaign=123campaign&utm_term=camp%123&utm_content=brand&gclid=abcdefg|user_agent=xyz"

str_match_all 提取模式。

  • \\w+:匹配一个或多个单词字符
  • (...):抓拍组
  • (?:...)?:匹配组零次或一次,但不捕获组。这用于处理 URL 的 query_string= 部分。
stringr::str_match_all(url, "(?:\\w+=)?(\\w+)=(\\w+)")
#> [[1]]
#>      [,1]                          [,2]           [,3]         
#> [1,] "query_string=utm_source=abc" "utm_source"   "abc"        
#> [2,] "utm_medium=yts"              "utm_medium"   "yts"        
#> [3,] "utm_campaign=123campaign"    "utm_campaign" "123campaign"
#> [4,] "utm_term=camp"               "utm_term"     "camp"       
#> [5,] "utm_content=brand"           "utm_content"  "brand"      
#> [6,] "gclid=abcdefg"               "gclid"        "abcdefg"    
#> [7,] "user_agent=xyz"              "user_agent"   "xyz"      

str_match_all 返回一个矩阵列表,其中第一列是完整匹配,后面是每个捕获的组。只保留捕获的组。

stringr::str_match_all(url, "(?:\\w+=)?(\\w+)=(\\w+)")[[1]][,2:3]
#>      [,1]           [,2]         
#> [1,] "utm_source"   "abc"        
#> [2,] "utm_medium"   "yts"        
#> [3,] "utm_campaign" "123campaign"
#> [4,] "utm_term"     "camp"       
#> [5,] "utm_content"  "brand"      
#> [6,] "gclid"        "abcdefg"    
#> [7,] "user_agent"   "xyz" 

【讨论】:

  • 我试过这个但得到一个如下所示的错误: stri_match_all_regex(string, pattern, omit_no_match = TRUE, opts_regex = opts(pattern)) 中的错误:参数str 应该是一个字符向量(或一个可强制的对象)
  • url 变量必须是字符向量。查看class(url)的结果。
  • 检查了类..它是一个字符
  • 使用了这个但是如何在不同的列中分开?
  • 类 URL 是一个字符。我有一个包含类似 URL 的列。对于一个 URL,我得到了这个解决方案,但是当我考虑所有时,我无法拆分
【解决方案2】:

URL 中只有一个条目包含查询字符串中的多个字段,第一个不包含任何字段。您不能真正从问题中的示例中创建数据框,但您可以创建一个包含查询字符串中的字段的命名向量列表,如下所示:

queries <- sapply(strsplit(sapply(strsplit(URL, "query_string="), 
                           `[`, 2), " \\|"), `[`, 1)

lapply(strsplit(queries, "\\&|="), function(x) 
  setNames(x[seq(length(x)/2) * 2], x[seq(length(x)/2) * 2 - 1]))
#> [[1]]
#> null 
#>   NA 
#> 
#> [[2]]
#>                       gclid 
#> "Lxi6sNo-A17RohDAcQgvD_fw4" 
#> 
#> [[3]]
#>    utm_source    utm_medium  utm_campaign   utm_content 
#>          "fb"         "ctw" "abcPant_rem"   "PantShirt" 

【讨论】:

  • 我使用的第一个命令是 fields=strsplit...但是在 charToRaw(URL) 中出现以下错误:参数应该是长度为 1 的字符向量,除了第一个元素将被忽略
  • @anonymus 这没有任何意义。 url 是字符向量吗?
  • 它是一个由多个 URL 组成的列。我仍然收到错误。因此,如果我的数据存储在 Mydata 中并且 Mydata 中的 URL 列是 MyURL,那么我已将您的命令替换为 fields
  • 任何答案@Allan
  • @anonymous 似乎 URLdecode 不喜欢矢量化输入。 Mydata$MyURL[1] 得到正确的结果吗?
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多