根据先前的文本元素从元素中提取特定链接

问题描述

我想从page提取每个立法程序(每个灰色框)的所有可用链接和可用文档("Referentenentwurf","Kabinett","Bundesrat" and "Inkrafttreten")的日期。我的数据集应具有以下结构:

Each legislative process is represented by one row and the information about the related documents are in the rows

这是第七个立法过程的HTML结构:

This is one example of the HTML-structure of the elements including the legislative processes

通过立法程序提取每个文档的日期不是问题(通过调查是否完成“ text()"-element includes e.g. "Kabinett"来完成)。

但是提取正确的URL困难得多,因为“ text()”元素(指示文档类型)没有直接与“”元素(包括URL)链接

我正在尝试为第七个立法程序(“ Zwanzigste Verordnung zur Änderung von Anlagen des Betäubungsmittelgesetzes")找到一个解决方案,以便将此解决方案应用于每个立法程序。

这是我目前的工作状态:

if(!require("rvest")) install.packages("rvest")
library(rvest) #for html_attr & read_html

if(!require("dplyr")) install.packages("dplyr")
library(dplyr) # for %>%

if(!require("stringr")) install.packages("stringr")
library(stringr) # for str_detect()

if(!require("magrittr")) install.packages("magrittr")
library(magrittr) # for extract()  [within pipes]

page <- read_html("https://www.bundesgesundheitsministerium.de/service/gesetze-und-verordnungen.html")

#Gesetz.Link -> here "Inkrafttreten"
    #Gesetz.Link <- lapply(1:72,function(x){
      x <- 7 # for demonstration reasons
      node.with.data <- html_nodes(page,css = paste0("#skiplink2maincontent > div.col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2 > div:nth-child(",x*2,") > div > div > div.panel-body > p")) %>%
        extract(
          str_detect(html_text(html_nodes(page,") > div > div > div.panel-body > p"))),"Inkrafttreten")
        ) 
      
      link <-  node.with.data %>%
        html_children() %>%
        extract(
          str_detect(html_text(html_nodes(node.with.data,xpath = paste0("text()"))),"Inkrafttreten")
        ) %>%
        html_attr("href")
      
      ifelse(length(node.with.data)==0,NA,link)  # set link to "NA" if there is no Link to "Referentenentwurf"
      
    #}) %>% 
    #  unlist()

(我已注释掉整个网站的申请,以便使解决方案与第七个要素相关。)

问题在于,可以链接到每个文档的多个URL(此处将“下载”和“ Stellungnahmen”链接到“ Referentenentwurf”)。这导致我的语法错误

有没有办法在另一个元素之后提取nth-element?因此可以检查“ text()”元素是否为“ Referentenentwurf”,然后提取其后面的第一个元素

-> "<a href="/fileadmin/Dateien/3_Downloads/Gesetze_und_Verordnungen/GuV/B/2020-03-04_RefE_20-BtMAEndV.pdf" ...>".

非常感谢您提供解决此问题的提示

解决方法

除此之外,我还可以自由更改代码中的一些内容并尝试将您带到您想要的地方:
我的目的是进入Verordnungen / Gesetze / etc。的列表,按需查找div.panel-body > p,并在其中的第一个链接指向可下载的文档,方法是搜索href包含使用xpath的“ / fileadmin / Dateien”。

看起来像这样:

library(purrr)
library(xml2)

html_nodes(page,css = '#skiplink2maincontent > div.col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2 > div') %>%
  map(~{
    .x %>%
      xml_find_first('./div/div/div[contains(@class,"panel-body")]/p//a[contains(@href,"/fileadmin/Dateien")]') %>%
      xml_attr('href')
  })

//更新:
如果上述假设对您不起作用,而您实际上只是想检查“ p元素中'Referentenentwurf'之后的第一个a标签,那么下面的内容确实可以帮助您。但是,我不能说它是“优雅”的,只是使用了正则表达式:)

html_nodes(page,"panel-body")]/p') %>%
      as.character() %>%
      str_extract_all('(?<=Referentenentwurf.{0,10000})(?<=<a href=")[^"]*(?=")') %>%
      unlist() %>%
      first()
    })