代码之家  ›  专栏  ›  技术社区  ›  Adrian del rio rodriguez

是否是从该表中收集信息的最佳工具?

  •  1
  • Adrian del rio rodriguez  · 技术社区  · 6 年前

    我使用了rvest包来提取公司列表和 a.href 每个公司中的元素,我需要继续数据收集过程。这是网站的链接: http://www.bursamalaysia.com/market/listed-companies/list-of-companies/main-market .

    我使用了以下代码来提取表,但没有任何结果。我使用了其他的方法,比如贴在“用rvest搜索NBA统计数据表”和类似链接中的方法,但是我不能得到我想要的。任何帮助都将不胜感激。

    我的代码:

    link.main <- 
     "http://www.bursamalaysia.com/market/listed-companies/list-of-companies/main-market/"
    
    web <- read_html(link.main) %>% 
    html_nodes("table#bm_equities_prices_table") 
        # it does not work even when I write html_nodes("table") 
        or ".table" or #bm_equities_prices_table
    
    web <- read_html(link.main) 
            %>% html_nodes(".bm_center.bm_dataTable") 
      # no working
    
    web <- link.main %>% read_html() %>% html_table() 
      # to inspect the position of table in this website 
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   dmi3kno    6 年前

    页面使用javascript生成表,因此您需要使用 RSelenium 或者是python的靓汤来模拟浏览器会话并允许运行javascript。

    另一种选择是使用@hrbrmstr调用的Awesome包 decapitated 基本上在后台运行无头Chrome浏览器会话。

    #devtools::install_github("hrbrmstr/decapitated")
    
    library(decapitated)
    library(rvest)
    
    res <- chrome_read_html(link.main)
    
    main_df <- res %>% 
      rvest::html_table() %>%
      .[[1]] %>%
      as_tibble()
    

    这样可以输出表的内容。如果要获取表的基础元素( href 属性后面的表格文本),你将需要做更多的列表体操。表中的一些元素实际上缺少链接,通过CSS提取被证明是困难的。

    library(dplyr)
    library(purrr)
    
    href_lst <- res %>% 
      html_nodes("table td") %>% 
      as_list() %>% 
      map("a") %>% 
      map(~attr(.x, "href"))
    
    # we need every third element starting from second element
    idx <- seq.int(from=2, by=3, length.out = nrow(main_df))
    
    href_df <- tibble(
      market_href=as.character(href_lst[idx]),
      company_href=as.character(href_lst[idx+1])
    )
    
    bind_cols(main_df, href_df)
    
    #> # A tibble: 800 x 5
    #>       No `Company Name`   `Company Website` market_href   company_href
    #>    <int> <chr>            <chr>             <chr>         <chr>       
    #>  1     1 7-ELEVEN MALAYS~ http://www.7elev~ /market/list~ http://www.~
    #>  2     2 A-RANK BERHAD [~ http://www.arank~ /market/list~ http://www.~
    #>  3     3 ABLEGROUP BERHA~ http://www.gefun~ /market/list~ http://www.~
    #>  4     4 ABM FUJIYA BERH~ http://www.abmfu~ /market/list~ http://www.~
    #>  5     5 ACME HOLDINGS B~ http://www.suppo~ /market/list~ http://www.~
    #>  6     6 ACOUSTECH BERHA~ http://www.acous~ /market/list~ http://www.~
    #>  7     7 ADVANCE SYNERGY~ http://www.asb.c~ /market/list~ http://www.~
    #>  8     8 ADVANCECON HOLD~ http://www.advan~ /market/list~ http://www.~
    #>  9     9 ADVANCED PACKAG~ http://www.advan~ /market/list~ http://www.~
    #> 10    10 ADVENTA BERHAD ~ http://www.adven~ /market/list~ http://www.~
    #> # ... with 790 more rows
    
        2
  •  1
  •   chinsoon12    6 年前

    另一个不使用浏览器的选项:

    library(httr)
    library(jsonlite)
    library(XML)
    r <- httr::GET(paste0(
        "http://ws.bursamalaysia.com/market/listed-companies/list-of-companies/list_of_companies_f.html",
        "?_=1532479072277",
        "&callback=jQuery16206432131784246533_1532479071878",
        "&alphabet=",
        "&market=main_market",
        "&_=1532479072277"))
    l <- rawToChar(r$content)
    m <- gsub("jQuery16206432131784246533_1532479071878(", "", substring(l, 1, nchar(l)-1), fixed=TRUE)
    tbl <- XML::readHTMLTable(jsonlite::fromJSON(m)$html)$bm_equities_prices_table
    

    输出:

    > head(tbl)
    #  No                      Company Name                Company Website
    #1  1 7-ELEVEN MALAYSIA HOLDINGS BERHAD      http://www.7eleven.com.my
    #2  2                 A-RANK BERHAD [S]        http://www.arank.com.my
    #3  3              ABLEGROUP BERHAD [S]       http://www.gefung.com.my
    #4  4             ABM FUJIYA BERHAD [S]    http://www.abmfujiya.com.my
    #5  5          ACME HOLDINGS BERHAD [S] http://www.supportivetech.com/
    #6  6              ACOUSTECH BERHAD [S]   http://www.acoustech.com.my/