html_table不适用于长行

时间:2017-03-23 23:49:57

标签: r web-scraping rvest

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

使用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)&gt; 1&amp; maxp * n!= sum(unlist(nrows))&amp; maxp * n出错   !=:缺少值需要TRUE / FALSE另外:警告   message:lapply(ncols,as.integer):强制引入的NA

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

感谢任何帮助

2 个答案:

答案 0 :(得分:3)

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

因此,只需编辑问题节点即可。

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]"))

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

答案 1 :(得分:0)

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

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))

希望这有帮助