Мне нужно извлечь некоторые конкретные 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-адреса, но дает мне несколько дополнительных из 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 всех данных, так как список слишком длинный для публикации. Его можно скачать здесь.

0
user1828605 7 Май 2020 в 06:51

2 ответа

Лучший ответ

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

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 это строка.

2
Ronak Shah 7 Май 2020 в 04:41

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

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
Eric Leung 7 Май 2020 в 04:29