如何根据某些条件在 R 中使用正则表达式提取 URL?
How to extract URLs using regex in R based on some criteria?
我需要从我使用 rvest
提取的问题底部列出的 URL 列表中提取一些特定的 URL
但是,我只需要提取以下
之一开头的URL
/assets/
/data
/files/
并包含以下单词之一(不区分大小写)
primary
elem
midd
high
但不是当 URL 以 /files/
开头时必须只包含 data-for-researchers/
我正在使用 R;所以我用 rvest
来提取数据:
代码
url %>%
html_nodes("a") %>% html_attr("href") %>%
str_subset(regex("^//*(assets|data|files).*((Primary|Elem|Midd|High)|(data-for-researchers))", ignore_case = T))
这在大部分情况下都有效——即它几乎提取了我需要的所有 URL,但它从 [=24] 开头的 URL 中给了我一些额外的=].
示例 - 正则表达式工作的地方
[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"
代码无效的地方
/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/
但我只想要此列表中的第 3 个,同时使用上面的代码保留我与其他列表匹配的所有其他列表。
我尝试了很多正则表达式模式的变体,但它大多只从上面删除了底部的 2 个。
我该如何解决这个问题?
数据
我将 link 添加到我放置所有数据 dput
的文件中,因为列表太长 post。可以下载here
我不知道你是否可以在正则表达式中做一个条件。所以我建议分两步完成这一步并合并列表。
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)
您可能需要根据您的数据更新以上内容。但我希望一般方法有意义。
您可以使用:
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))
或者在 base R 中使用 grep
:
grep('(assets/|data/).*((Primary|Elem|Midd|High))|(files.*data-for-researchers/)',
x, value = TRUE, ignore.case = TRUE)
其中 x
是字符串。
我需要从我使用 rvest
但是,我只需要提取以下
之一开头的URL/assets/
/data
/files/
并包含以下单词之一(不区分大小写)
primary
elem
midd
high
但不是当 URL 以 /files/
开头时必须只包含 data-for-researchers/
我正在使用 R;所以我用 rvest
来提取数据:
代码
url %>%
html_nodes("a") %>% html_attr("href") %>%
str_subset(regex("^//*(assets|data|files).*((Primary|Elem|Midd|High)|(data-for-researchers))", ignore_case = T))
这在大部分情况下都有效——即它几乎提取了我需要的所有 URL,但它从 [=24] 开头的 URL 中给了我一些额外的=].
示例 - 正则表达式工作的地方
[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"
代码无效的地方
/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/
但我只想要此列表中的第 3 个,同时使用上面的代码保留我与其他列表匹配的所有其他列表。
我尝试了很多正则表达式模式的变体,但它大多只从上面删除了底部的 2 个。
我该如何解决这个问题?
数据
我将 link 添加到我放置所有数据 dput
的文件中,因为列表太长 post。可以下载here
我不知道你是否可以在正则表达式中做一个条件。所以我建议分两步完成这一步并合并列表。
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)
您可能需要根据您的数据更新以上内容。但我希望一般方法有意义。
您可以使用:
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))
或者在 base R 中使用 grep
:
grep('(assets/|data/).*((Primary|Elem|Midd|High))|(files.*data-for-researchers/)',
x, value = TRUE, ignore.case = TRUE)
其中 x
是字符串。