【问题标题】:webscraping with rvest: Replace missing values of html_nodes with NA使用 rvest 进行网络抓取:用 NA 替换 html_nodes 的缺失值
【发布时间】:2023-10-10 23:06:01
【问题描述】:

我抓取this 页面以获取其中列出的每个人的 (1) 姓名、(2) 角色/编辑头衔和 (3) 所属机构

问题是有些人没有机构隶属关系。我想用NA 替换这些缺失值,但我的尝试都没有奏效。

感谢您的帮助!到目前为止,这是我的代码:

    journal_url <- "https://www.journals.elsevier.com/academic-pediatrics/editorial-board"
    webpage <- xml2::read_html(journal_url)
    webpage <- rvest::html_nodes(webpage, "div.publication-editors")

    editorsnodes <- rvest::html_children(webpage)

    titlesnodesnum <- which(rvest::html_attr(editorsnodes, "class") == "publication-editor-type")
    titles <- editorsnodes[titlesnodesnum]
    titles <- rvest::html_text(titles)
    titles <- trimws(titles)
    titlesnodesnum <- c(titlesnodesnum, length(editorsnodes)+1) #identify the last record

    editors <- lapply(2:length(titlesnodesnum), function(n){
      start<- titlesnodesnum[n-1]+1  #starting node in subcategory
      end <- titlesnodesnum [n]-1   #ending node in subcategory
      names <- editorsnodes[start:end]
      names <- rvest::html_nodes(names, "div.publication-editor-name")
      names <- rvest::html_text(names)
      names <- trimws(names)
    })

我的主要尝试是在editors &lt;- lapply([...]) 部分中插入一个for-loop,其中包含if(length(names) == 0) names &lt;- NA 之类的内容,但没有任何效果。

P。 S. 我的数据结构可能看起来很复杂,但我需要为此目的保留嵌套列表的结构(有关背景,请参阅我之前发布的 this other question - 以及我从下面获得的大部分代码)。

【问题讨论】:

    标签: r web-scraping nested-lists rvest


    【解决方案1】:

    附加的子例程将提取网页上列出的人员的从属关系(如果有)。对于那些没有从属关系的人,代码将插入一个“NA”。您的代码的问题之一是名称没有抓取节点“span.publication-editor-affiliation”。我还使用“is_empty()”来检测是否没有列出隶属关系。

    affiliations <- lapply(2:length(titlesnodesnum), function(n){
      start<- titlesnodesnum[n-1]+1  #starting node in subcategory
      end <- titlesnodesnum [n]-1   #ending node in subcategory
      affiliations <- editorsnodes[start:end]
      affiliations <- rvest::html_nodes(affiliations, "span.publication-editor-affiliation")
      affiliations <- rvest::html_text(affiliations)
      if (purrr::is_empty(affiliations)){affiliations=NA} 
      affiliation <- trimws(affiliations)
    })
    

    【讨论】:

    • 太好了,快到了,谢谢!虽然它似乎仍然想念一个没有隶属关系的人(第四任副主编 J. L. Raphael),但没有给他NA。我认为原因是他根本没有节点span.publication-editor-affiliation。你会碰巧知道如何解决它吗?我将不胜感激!
    【解决方案2】:

    我找到了解决方案。我使用toString将xml节点集更改为字符串,提取所有&lt;div class="publication-editor"&gt;并检查它们是否每个都有一个&lt;span class="publication-editor-affiliation"&gt;;当他们没有时,lapplystr_extract的组合导致NA

    这是代码,供记录。

        affiliations <- lapply(2:length(titlesnodesnum), function(n){
          start<- titlesnodesnum[n-1]+1  #starting node in subcategory
          end <- titlesnodesnum [n]-1   #ending node in subcategory
          affiliations <- toString(editorsnodes[start:end])
          affiliations <- stringr::str_extract_all(affiliations, "(?<=<div class=\"publication-editor\")[\\S\\s]*?(?=<div class=\"clearfix\">)")
          affiliations <- lapply(affiliations, function(x) stringr::str_extract(x, "(?<=<span class=\"publication-editor-affiliation\" itemprop=\"affiliation\">).*?(?=</span>)"))
        })
    

    【讨论】:

      最近更新 更多