根据先前的文本元素提取特定的 link 表单元素
Extracting a specific link form an element based on a previous text-element
我想从 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, 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"))),
"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
,并在其中第一个 link 引用可下载文档,方法是搜索 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-element 中 'Referentenentwurf' 之后的第一个 a
标签”,下面的内容确实可以帮到您。但是,我不能让它变得“优雅”,只是使用了一个正则表达式:)
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') %>%
as.character() %>%
str_extract_all('(?<=Referentenentwurf.{0,10000})(?<=<a href=")[^"]*(?=")') %>%
unlist() %>%
first()
})
我想从 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, 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"))),
"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
,并在其中第一个 link 引用可下载文档,方法是搜索 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-element 中 'Referentenentwurf' 之后的第一个 a
标签”,下面的内容确实可以帮到您。但是,我不能让它变得“优雅”,只是使用了一个正则表达式:)
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') %>%
as.character() %>%
str_extract_all('(?<=Referentenentwurf.{0,10000})(?<=<a href=")[^"]*(?=")') %>%
unlist() %>%
first()
})