【问题标题】:R converting XML nodesets of <p> elements into dataframe when scraping table with rvestR在使用rvest抓取表时将<p>元素的XML节点集转换为数据框
【发布时间】:2021-09-22 05:23:54
【问题描述】:

我们正在从https://nbpa.com/agents/directory 提取联系信息。页面上没有表格,而是&lt;div&gt;s,里面有&lt;p&gt;元素:

我们可以通过以下方式获取这个元素:

agents_url <- "https://nbpa.com/agents/directory"
agents_page <- agents_url %>% read_html()
agents_page_elements <- agents_page %>% html_nodes('div.accordion-inner')

agents_page_elements[1]
agents_page_elements[1] %>% html_nodes('p')

我们希望将其转换为 1 行数据框:

Cell             Email                  Professional Credentials:
(123) 456-7890   firstlast@email.com    "NBA Certified Player Agent..."

这可能吗?这个网页抓取的挑战在于网站上的每个 accordion-inner div 都有不同的 p 元素。有些有 Cell: 和 Email:,其他有 Education:、Address: 等。它因手风琴内部而异。如果我们可以将每个单独的节点变成一个 1 行数据帧,我们就可以使用 plyr::rbind.fill() 将所有数据帧 rbind 在一起。

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    得到text后我们可以使用read.dcf

    new <- agents_page_elements[1] %>%
         html_nodes('p') %>%
         html_text()
    as.data.frame(read.dcf(textConnection(new)))
    

    -输出

        Cell                            Email                                                             Professional Credentials
    1 (240) 668-4241 barry.aberdeen@tributesports.com NBA Certified Player Agent, FIBA Certified Player Agent, WNBA Certified Player Agent
    

    对于多个元素,使用map

    library(purrr)
    library(dplyr)
    library(stringr)
    out <- map_dfr(agents_page_elements, ~ {
           new <- .x %>% 
                   html_nodes('p') %>%
                   html_text() %>%
                   str_replace_all("\n\\s*", " ")
        if(length(new) > 0) {
           as.data.frame(read.dcf(textConnection(new)))
         } else NULL
    
         })
    

    -输出

    > dim(out)
    [1] 455   9
    > head(out, 2)
                Cell                            Email                                                             Professional Credentials    Title
    1 (240) 668-4241 barry.aberdeen@tributesports.com NBA Certified Player Agent, FIBA Certified Player Agent, WNBA Certified Player Agent     <NA>
    2 (281) 773-7339                             <NA>                                     Texas Bar No. 24050197|Wisconsin Bar No. 1045470 Attorney
                 Company Name                                                                                             Education Address Office International
    1                    <NA>                                                                                                  <NA>    <NA>   <NA>          <NA>
    2 Adams & Associates, LLC University of Southern California B.S. |University of Houston - M.B.A |University of Wisconsin - J.D.    <NA>   <NA>          <NA>
    

    【讨论】:

    • 这太好了,谢谢。你认为有可能抓住名字吗?我正在尝试更新此解决方案以获取名称。它们位于兄弟 元素中,这使得获取名称有点困难
    • 是的,我做了类似的事情并得到了名字。谢谢
    • 我的想法官方有点被这个震惊了。 + R 总是让我感到惊讶。谢谢你。
    • @QHarr 在R 中,您不需要明确指定return。它将返回最后一个评估表达式的值。即map 是一种lapply - lapply(1:5, function(x) data.frame(col1 = x))
    • @QHarr 我一般不使用closeread.table(textConnection(.. 等。但是,正如你所说,最好关闭
    猜你喜欢
    • 2020-08-15
    • 2019-05-31
    • 2018-08-26
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多