R web-scraping на многоуровневом веб-сайте с не динамическими URL - PullRequest
0 голосов
/ 08 апреля 2019

Прошу прощения, если не нашел предыдущую тему по этому вопросу.Я хочу почистить этот сайт http://www.fao.org/countryprofiles/en/ В частности, эта страница содержит множество ссылок на информацию о стране.Структура этих ссылок:

http://www.fao.org/countryprofiles/index/en/?iso3=KAZ

http://www.fao.org/countryprofiles/index/en/?iso3=AFG

, и любая из этих страниц содержит интересующий меня раздел новостей. Конечно, я мог бы поцарапатьпостранично, но это было бы пустой тратой времени.

Я пробовал следующее, но это не работает:

countries <- read_html("http://www.fao.org/countryprofiles/en/") %>%
  html_nodes(".linkcountry") %>%
  html_text()

country_news <- list()
sub <- html_session("http://www.fao.org/countryprofiles/en/")

for(i in countries[1:100]){
  page <- sub %>% 
    follow_link(i)  %>% 
    read_html()
  country_news[[i]] <- page %>%
    html_nodes(".white-box") %>%
    html_text()
}

Есть идеи?

1 Ответ

1 голос
/ 08 апреля 2019

Вы можете получить все дочерние страницы со страницы верхнего уровня:

stem = 'http://www.fao.org'

top_level = paste0(stem, '/countryprofiles/en/')

all_children = read_html(top_level) %>% 
  # ? and = are required to skip /iso3list/en/
  html_nodes(xpath = '//a[contains(@href, "?iso3=")]/@href') %>% 
  html_text %>% paste0(stem, .)

head(all_children)
# [1] "http://www.fao.org/countryprofiles/index/en/?iso3=AFG"
# [2] "http://www.fao.org/countryprofiles/index/en/?iso3=ALB"
# [3] "http://www.fao.org/countryprofiles/index/en/?iso3=DZA"
# [4] "http://www.fao.org/countryprofiles/index/en/?iso3=AND"
# [5] "http://www.fao.org/countryprofiles/index/en/?iso3=AGO"
# [6] "http://www.fao.org/countryprofiles/index/en/?iso3=ATG"

Если вам не нравится xpath, версия CSS будет выглядеть так:

html_nodes('a') %>% html_attr('href') %>% 
  grep("?iso3=", ., value = TRUE, fixed = TRUE) %>% paste0(stem, .)

Теперь вы можете перебирать эти страницы и извлекать то, что вы хотите

...