【问题标题】:rvest: extract tables with url's instead of textrvest:使用 url 而不是文本提取表格
【发布时间】:2017-04-11 10:41:12
【问题描述】:

我想抓取的表格中有网址。如果我运行代码,我只会得到带有 url 描述的列。如何获取实际具有一列(在我的情况下为第二列)与 URL 而不是其描述)或具有锚的完整 html 代码的表?。我需要它从表的第二列中的 URL 中提取两个索引代码。我想抓取的链接如下所示:https://aplikacje.nfz.gov.pl/umowy/Agreements/GetAgreements?ROK=2017&ServiceType=03&ProviderId=20795&OW=15&OrthopedicSupply=False&Code=150000001,我需要 ProviderId 和代码编号,但首先我需要由下面的代码抓取的表中的链接。

table<-0
library(rvest)
for (i in 1:10){
  url<-paste0("https://aplikacje.nfz.gov.pl/umowy/Provider/Index?ROK=2017&OW=15&ServiceType=03&OrthopedicSupply=False&page=",i)
  page<-html_session(url)
  table[i]<-html_table(page)
}

感谢所有 cmets 和帮助。

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    这有助于获得一个漂亮、干净、完整的表格,其中包含您想要的 href:

    library(rvest)
    library(tidyverse)
    
    # Helpers
    rm_extra <- function(x) { gsub("\r.*$", "", x) }
    
    mk_gd_col_names <- function(x) {
      tolower(x) %>%
        gsub("\ +", "_", .)
    }
    
    URL <- "https://aplikacje.nfz.gov.pl/umowy/Provider/Index?ROK=2017&OW=15&ServiceType=03&OrthopedicSupply=False&page=%d"
    
    get_table <- function(page_num = 1) {
    
      pg <- read_html(sprintf(URL, page_num))
    
      tab <- html_nodes(pg, "table")
    
      html_table(tab)[[1]][,-c(1,11)] %>%
        set_names(rm_extra(colnames(.) %>% mk_gd_col_names)) %>%
        mutate_all(funs(rm_extra)) %>%
        mutate(link = html_nodes(tab, xpath=".//td[2]/a") %>% html_attr("href")) %>%
        as_tibble()
    
    }
    
    pb <- progress_estimated(10)
    map_df(1:10, function(i) {
      pb$tick()$print()
      get_table(page_num = i)
    }) -> full_df
    
    glimpse(full_df)
    ## Observations: 93
    ## Variables: 10
    ## $ kod                         <chr> "150000016", "150005039", "1500046...
    ## $ nazwa_świadczeniodawcy      <chr> "SAMODZIELNY PUBLICZNY ZAKŁAD OPIE...
    ## $ miasto                      <chr> "GRODZISK WIELKOPOLSKI", "KALISZ",...
    ## $ ulica                       <chr> "MOSSEGO 17", "POZNAŃSKA 23", "OS....
    ## $ kod_pocztowy                <chr> "62065", "62800", "60688", "62510"...
    ## $ nip                         <chr> "9950036856", "6181976770", "97201...
    ## $ regon                       <chr> "317760", "251525840", "630804009"...
    ## $ sumaryczna_kwota_zobowiązań <chr> "8 432 922,00", "332 078,25", "416...
    ## $ szczegóły                   <chr> "Umowy", "Umowy", "Umowy", "Umowy"...
    ## $ link                        <chr> "/umowy/Agreements/GetAgreements?R...
    
    full_df
    ## # A tibble: 93 × 10
    ##          kod
    ##        <chr>
    ## 1  150000016
    ## 2  150005039
    ## 3  150004658
    ## 4  150009135
    ## 5  150003546
    ## 6  150000066
    ## 7  150003556
    ## 8  150000073
    ## 9  150003539
    ## 10 150008909
    ## # ... with 83 more rows, and 9 more variables:
    ## #   nazwa_świadczeniodawcy <chr>, miasto <chr>, ulica <chr>,
    ## #   kod_pocztowy <chr>, nip <chr>, regon <chr>,
    ## #   sumaryczna_kwota_zobowiązań <chr>, szczegóły <chr>, link <chr>
    

    【讨论】:

    • 看起来不错,但在我的机器上运行不佳。它向我抛出:Error in open.connection(x, "rb") : Peer certificate cannot be authenticated with given CA certificates
    • 现在它在我使用你的评论中的 httr::GET 技巧后工作了! stackoverflow.com/questions/34551299/…
    • 您可能需要考虑更新您的本地系统 CA。
    • 如果在链接下找不到表格,它会引发错误。然后,如果可以的话,我希望它继续并获得下一张桌子。如何跳过此链接?我试过 try() map_df(1:nrow(full_df2), function(i) { pb$tick()$print() try(get_table(page_num = i),silent=T) } ) -&gt; full_df3 没有帮助。它给我一个错误Error in bind_rows_(x, .id) : cannot convert object to a data frame
    • 我似乎通过将 html_table(tab)[[1]][,-c(1,8)] %>%.... 部分放入函数中来解决我的评论中的问题trycatch(, silent=T) 中的 get_table。我意识到这很丑陋。我很惭愧,不能把它放在你的回答中。您能否建议它是否可以打印评论:警告,这次没有找到表,然后继续?
    【解决方案2】:

    这是从一页获取它们的方法。请注意,我使用 %>% 运算符,这样更易​​于阅读,但如果您愿意,可以嵌套调用

    library(rvest)
    url<-paste0("https://aplikacje.nfz.gov.pl/umowy/Provider/Index?ROK=2017&OW=15&ServiceType=03&OrthopedicSupply=False&page=1")
    page<-html_session(url)
    links <- html_nodes(page, 'table') %>% html_nodes("a") %>% html_attr("href")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多