首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用R中的正则表达式根据一定的准则提取URL?

如何利用R中的正则表达式根据一定的准则提取URL?
EN

Stack Overflow用户
提问于 2020-05-07 03:51:25
回答 2查看 239关注 0票数 0

我需要从URL列表中提取一些特定的URL,这些URL列在我使用rvest提取的问题的底部。

但是,我只需要提取以下列之一开头的URL

  • /assets/
  • /data
  • /files/

并包含以下单词之一(大小写不敏感)

  • primary
  • elem
  • midd
  • high

但当URL以/files/开头时则不是这样,后者必须只包含data-for-researchers/

我使用R;所以我使用rvest提取数据:

代码语言:javascript
复制
url %>%
        html_nodes("a") %>% html_attr("href") %>%
        str_subset(regex("^//*(assets|data|files).*((Primary|Elem|Midd|High)|(data-for-researchers))", ignore_case = T))

这在很大程度上是可行的--也就是说,它提取了我所需的几乎所有URL,但它从以\files\开头的URL中给了我一些额外的部分。

示例-正则表达式工作的

代码语言:javascript
复制
[1] "https://www.ed.sc.gov/assets/reportCards/2008/documents/Primary_School_Performance_File_2008.xls"                     
 [2] "https://www.ed.sc.gov/assets/reportCards/2008/documents/Primary_School_Fact_File_2008.xls"                            
 [3] "https://www.ed.sc.gov/assets/reportCards/2008/documents/2008-ELEM-Schools-Performance-Data.xls"                       
 [4] "https://www.ed.sc.gov/assets/reportCards/2008/documents/Elementary_School_Fact_File_2008.xls"                         
 [5] "https://www.ed.sc.gov/assets/reportCards/2008/documents/2008-MIDDLE-Schools-Performance-Data.xls"                     
 [6] "https://www.ed.sc.gov/assets/reportCards/2008/documents/Middle_School_Fact_File_2008.xls"                             

代码不工作的

代码语言:javascript
复制
/files/2018/data-files/high-school-ela-math-results/                                
/files/2018/data-files/elementary-middle-ela-math-results/                          
/files/2018/data-files/2018-report-card-data-for-researchers/                       
/files/2018/data-files/2018-report-card-data-for-researchers-additional-information/

但是,我只想从这个列表中获得第三个,同时使用上面的代码保存我与其他列表匹配的所有其他代码。

我尝试了许多regex模式的变体,但它大多只是从上面删除了底部2。

我怎么才能解决这个问题?

数据

我将链接添加到将所有数据的dput放在其中的文件,因为列表太长,无法发布。可以下载这里

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-07 04:41:26

您可以使用:

代码语言:javascript
复制
library(rvest)
library(stringr)

url %>%
  html_nodes("a") %>% html_attr("href") %>%
  str_subset(regex('(assets/|data/).*((Primary|Elem|Midd|High))|(files.*data-for-researchers/)', ignore_case = TRUE))

或者在基数R中使用grep

代码语言:javascript
复制
grep('(assets/|data/).*((Primary|Elem|Midd|High))|(files.*data-for-researchers/)',
     x, value = TRUE, ignore.case = TRUE)

其中x是字符串。

票数 2
EN

Stack Overflow用户

发布于 2020-05-07 04:29:05

我不知道你能不能用正则表达式做条件。因此,我建议分两步完成这一步,并将列表组合起来。

代码语言:javascript
复制
most_data <-
    url %>%
    html_nodes("a") %>% html_attr("href") %>%
    str_subset(regex("^//*(assets|data).*((Primary|Elem|Midd|High)|(data-for-researchers))", ignore_case = T))

remaining_data <-
    url %>%
    html_nodes("a") %>% html_attr("href") %>%
    str_subset(regex("^//*files.*((Primary|Elem|Midd|High)|(data-for-researchers))", ignore_case = T))

all_data <- c(most_data, remaining_data)

您可能必须根据您的数据更新上述内容。但我希望总的方法是有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61649587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档