首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据以前的文本元素从元素中提取特定链接。

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

Stack Overflow用户
提问于 2020-08-20 10:20:38
回答 1查看 61关注 0票数 0

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

每个立法过程由一行表示,有关相关文件的信息列在行中。

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

这是元素的HTML结构的一个例子,包括立法过程。

在每个立法过程中提取每个文档的日期并不是一个问题(仅仅是通过调查是否为“text()"-element includes e.g. "Kabinett"”)。

但是提取正确的URL要困难得多,因为"text()"-elements (指示文档类型)没有直接链接到“-elements”(包括URL)。

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

这是我目前的工作状况:

代码语言:javascript
复制
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()"-element是否为"Referentenentwurf“,然后提取其后面的第一个元素。

代码语言:javascript
复制
-> "<a href="/fileadmin/Dateien/3_Downloads/Gesetze_und_Verordnungen/GuV/B/2020-03-04_RefE_20-BtMAEndV.pdf" ...>".

我将非常感谢关于如何解决这个问题的建议!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-20 10:39:14

除此之外,我还自由地更改了代码中的一些内容,并试图将您带到您想要的地方:

我的尝试是进入Verordnungen/Gesetze/等等的列表中,像您所做的那样查找div.panel-body > p,在该链接中使用xpath搜索包含"/fileadmin/Dateien“的href

看起来是这样的:

代码语言:javascript
复制
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-tag’”,那么下面的内容就可以了。然而,我无法使它变得“优雅”,只使用regex :)

代码语言:javascript
复制
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()
    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63503014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档