Как извлечь URL-адреса с помощью регулярного выражения в R на основе некоторых критериев? - PullRequest
0 голосов
/ 07 мая 2020

Мне нужно извлечь некоторые определенные c URL-адреса из списка URL-адресов, которые указаны в конце вопроса, который я извлек с помощью rvest

Однако мне нужно извлечь только те URL-адреса, которые начинаются с одного из следующих

  • /assets/
  • /data
  • /files/

и содержат один из следующие слова (без учета регистра)

  • primary
  • elem
  • midd
  • high

, но не тогда, когда URL-адрес начинается с /files/, который тогда должен содержать только data-for-researchers/

Я использую R; поэтому я использовал rvest для извлечения данных:

CODE

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\.

Пример - где работает регулярное выражение

[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 сверху.

Как это исправить?

DATA

Я добавляю ссылку на файл, куда помещаю dput всех данных так как список слишком длинный для публикации. Его можно скачать здесь

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Вы можете использовать:

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))

Или используя grep в базе R:

grep('(assets/|data/).*((Primary|Elem|Midd|High))|(files.*data-for-researchers/)',
     x, value = TRUE, ignore.case = TRUE)

, где x - строка.

0 голосов
/ 07 мая 2020

Я не знаю, можете ли вы использовать условное выражение в регулярном выражении. Поэтому я предлагаю сделать этот шаг в два этапа и объединить списки.

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)

Возможно, вам придется обновить приведенное выше на основе ваших данных. Но я надеюсь, что общий подход имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...