html_attr «href» не извлекает ссылку

#r #web-scraping #rvest

#r #очистка веб-страниц #rvest

Вопрос:

Я хочу загрузить файл, который находится на вкладке «Досье» с текстом «Модуль 4» здесь:

https://www.g-ba.de/bewertungsverfahren/nutzenbewertung/5/#dossier

Сначала я хочу получить ссылку. Мой код для этого выглядит следующим образом:

 "https://www.g-ba.de/bewertungsverfahren/nutzenbewertung/5/#dossier" %>% 
    read_html %>% 
    html_nodes(".gba-download__text") %>% 
    .[[4]] %>% 
    html_attr("href")
 

(Я знаю, что фрагмент .[[4]] не очень хорош, это не мой полный код.)
Это приводит к NA тому, и я не понимаю, почему.
Подобные вопросы здесь не помогут.

Ответ №1:

Аллан уже оставил краткий ответ. Но позвольте мне оставить другой способ. Если вы проверите источник страницы, то увидите, что цель находится внутри .gba-download-list . (На самом деле их два.) Так что берите эту часть и переходите к href части. Как только вы получите URL-адреса, вы можете использовать grep() для идентификации ссылки, содержащей Modul4 . Я использовал unique() в конце, чтобы удалить обман.

 read_html("https://www.g-ba.de/bewertungsverfahren/nutzenbewertung/5/#dossier") %>% 
  html_nodes(".gba-download-list") %>%
  html_nodes("a") %>% 
  html_attr("href") %>% 
  grep(pattern = "Modul4", value = TRUE) %>% 
  unique()

[1] "/downloads/92-975-67/2011-12-05_Modul4A_Apixaban.pdf"
 

Комментарии:

1. Большое вам спасибо, отличный ответ тоже!

Ответ №2:

Проще добраться до определенного узла, если вы используете xpath :

 library(rvest)

"https://www.g-ba.de/bewertungsverfahren/nutzenbewertung/5/#dossier" %>% 
    read_html %>% 
    html_nodes(xpath = "//span[contains(text(),'Modul 4')]/..") %>% 
    .[[1]] %>% 
    html_attr("href")

#> [1] "/downloads/92-975-67/2011-12-05_Modul4A_Apixaban.pdf"
 

Комментарии:

1. Большое вам спасибо, это действительно отличное решение! Не могли бы вы немного объяснить это? Не знал что-то вроде contains(text() … У вас есть ключевое слово, которое я могу изучить? И почему я получаю ссылку дважды, если я не использую .[[1]] ?

2. @TobiSonne xpath — это грамматика для навигации по xml и html. Он полностью отделен от R, но реализован в xml2 и rvest . Вы можете получить введение здесь , но в этом случае путь гласит: «найдите любой тег span, текст которого содержит «Modul 4″, затем перейдите к его родительскому узлу». Причина .[[1]] та же, что и у вас — оказывается, было 2 одинаковых узла, но я хотел только один из них. Я не знаю, почему их два. Проблема с веб-очисткой заключается в том, что html часто меняется, и его структура не всегда имеет смысл!

Ответ №3:

Теперь у меня есть другое решение, и я хочу поделиться им:

 "https://www.g-ba.de/bewertungsverfahren/nutzenbewertung/5/#dossier" %>% 
    read_html %>% 
    html_nodes("a.download-helper") %>% 
    html_attr("href") %>% 
    .[str_detect(., "Modul4")] %>% 
    unique
 

Ответ №4:

Быстрее использовать селектор css с оператором contains для таргетинга на href по подстроке. Кроме того, необходимо вернуть только одно совпадение узлов

 library(rvest)

 url <- "https://www.g-ba.de/bewertungsverfahren/nutzenbewertung/5/#dossier"
 link <-  read_html(url) %>% 
    html_node("[href*='Modul4']") %>% 
    html_attr("href") %>% url_absolute(url)