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