【问题标题】:Table’s header row conflicts with html_table function表格的标题行与 html_table 函数冲突
【发布时间】:2017-08-16 18:32:59
【问题描述】:

我正在尝试提取页面上的表格

使用 html_table 和 rvest,但是第一个文本,第一行是表格的一部分,显然会导致与 html_table 发生冲突。我留下代码

#Library's
library(rvest)
library(XML)

    url<-"http://www.svs.cl/institucional/mercados/consulta.php?mercado=V&Estado=VI&entidad=RVEMI" #page
    url<-read_html(url) 
    table<-html_nodes(url,"table") #read notes
    table<-html_table(table,fill=TRUE) #write like table

错误是

if (length(p) > 1 & maxp * n != sum(unlist(nrows)) & maxp * n 中的错误 != :需要 TRUE/FALSE 的缺失值另外:警告 消息:在 lapply(ncols, as.integer) 中:强制引入的 NAs

也许可以用html_text写,但我需要表格格式。

感谢任何帮助

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    这是一个混乱的解决方案,但在这种情况下它应该可以工作。看起来 HTML 表的前 2 行是标题,这可能会导致问题。我必须执行一种蛮力方法来读取所有单元格并创建自己的表格。

    library(rvest)
    #library(XML)  #not needed
    
    url<-"http://www.svs.cl/institucional/mercados/consulta.php?mercado=V&Estado=VI&entidad=RVEMI" #page
    url<-read_html(url) 
    table<-html_nodes(url,"table") #read notes
    
    #find the rows and remove the first one
    rows<-(html_nodes(table, "tr")[-1])
    
    #now find each item in each row
    values<-html_text(html_nodes(rows, "td"))
    
    #clean up values by removing whitespace, /t, /r, /n
    values<-trimws(gsub("(\\t|\\n|\\r)", "", values))
    
    #covert into a data framme
    finaltable<-as.data.frame(matrix(values, ncol=3, byrow=TRUE))
    

    希望这会有所帮助。

    【讨论】:

    • 是的,使用 html_text 写表的命令也很有用。谢谢
    【解决方案2】:

    这不是表格的大小,而是前两行中极其粗糙的节点。

    所以,只需编辑出问题节点。

    xml2 现在支持更广泛的libxml2 操作:

    library(rvest)
    library(tidyverse)
    
    pg <- read_html("http://www.svs.cl/institucional/mercados/consulta.php?mercado=V&Estado=VI&entidad=RVEMI")
    
    xml_remove(html_nodes(pg, xpath=".//table/tr[1]"))
    xml_remove(html_nodes(pg, xpath=".//table/tr[1]"))
    
    html_nodes(pg, xpath=".//table") %>% 
      html_table() %>% 
      .[[1]] %>% 
      as_tibble()
    
    ## # A tibble: 368 × 3
    ##            X1                                                   X2    X3
    ##         <chr>                                                <chr> <chr>
    ## 1  76675290-K                                       AD RETAIL S.A.    VI
    ## 2  98000000-1  ADMINISTRADORA  DE FONDOS DE PENSIONES CAPITAL S.A.    VI
    ## 3  98000100-8  ADMINISTRADORA  DE FONDOS DE PENSIONES HABITAT S.A.    VI
    ## 4  76240079-0    ADMINISTRADORA DE FONDOS DE PENSIONES CUPRUM S.A.    VI
    ## 5  76762250-3    ADMINISTRADORA DE FONDOS DE PENSIONES MODELO S.A.    VI
    ## 6  98001200-K ADMINISTRADORA DE FONDOS DE PENSIONES PLANVITAL S.A.    VI
    ## 7  76265736-8   ADMINISTRADORA DE FONDOS DE PENSIONES PROVIDA S.A.    VI
    ## 8  94272000-9                                       AES GENER S.A.    VI
    ## 9  96566940-K                            AGENCIAS UNIVERSALES S.A.    VI
    ## 10 91253000-0                        AGRICOLA NACIONAL S.A.C. E I.    VI
    ## # ... with 358 more rows
    

    注意你可以这样做:

    xml_remove(html_nodes(pg, xpath=".//table/tr[position() >= 1 and position() <=2]"))
    

    而不是两个删除操作,但它几乎一样冗长,这里没有真正的性能提升。

    【讨论】:

    • 谢谢,这就是我想要的答案:)。 xml_remove 函数非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多