【问题标题】:Extracting html tables to R将html表提取到R
【发布时间】:2014-07-04 12:20:22
【问题描述】:

我有一个包含表格的静态 html 文件列表。我需要从该表中提取一个特定列(第 4 列)。我正在使用 R 从 html 中提取表格,但行似乎已为该列合并(似乎 readHTMLTable api 不接受 hrml 中的
标签)。任何帮助将不胜感激

这是我的 R 代码:

library('XML')
table<-readHTMLTable("C:\\Desktop\\TEST\\140.html")
n.rows <- unlist(lapply(table, function(t) dim(t)[1]))
output <- table[[which.max(n.rows)]]
output[,4] 

输出:

[1] 214                                                                               
[2] 321/2/1                                                                           
[3] 321/5                                                                             
[4] 353/11/1/1/1                                                                      
[5] 141/1143/1 
[6] 319/3/1                 

理想的输出应该是

[1] 214                                                                               
[2] 321/2/1                                                                           
[3] 321/5                                                                             
[4] 353/11/1/1/1                                                                      
[5] 141/1
[6] 143/1 
[7] 319/3/1     

第 [6] 行刚刚被合并。

html文件示例如下:

  <table>
<tr> 
<td align="left" valign="top"><font face="Mangal"> 
  1
  </font></td>
<td height="29" align="left" valign="top"><div align="left"><font face="Mangal"> 
    86/2/5
    </font> </div></td>
<td align="left" valign="top" bordercolor="#CCCCCC"> 
  0.036<br>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    86/2/5<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    0.036<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    बिहारीलाल किसनलाल जुझारसिंह छगनलाल पिता भागमल<br>जाति रूवाला<br>पता निवासी ग्राम<br>भूमि स्वामी<br>
    </font></div></td>

 </tr>

  <tr> 
 <td align="left" valign="top"><font face="Mangal"> 
  2
  </font></td>
 <td height="29" align="left" valign="top"><div align="left"><font face="Mangal"> 
    214
    </font> </div></td>
 <td align="left" valign="top" bordercolor="#CCCCCC"> 
  0.051<br>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div></td>
 <td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    214<br>
    </font></div></td>
 <td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    0.051<br>
    </font></div></td>
 <td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    गंगाराम पिता किशना<br>जाति कुमहार<br>पता नि.चोरखेडी<br>भूमि स्वामी<br>
    </font></div></td>

  </tr>

  <tr> 
  <td align="left" valign="top"><font face="Mangal"> 
  3
  </font></td>
<td height="29" align="left" valign="top"><div align="left"><font face="Mangal"> 
    321/2/1
    </font> </div></td>
<td align="left" valign="top" bordercolor="#CCCCCC"> 
  0.063<br>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    321/2/1<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    0.063<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    गंगाराम पिता घीसा<br>जाति खाती<br>पता निवासी ग्राम<br>भूमि स्वामी<br>
    </font></div></td>

  </tr>

  <tr> 
<td align="left" valign="top"><font face="Mangal"> 
  4
  </font></td>
<td height="29" align="left" valign="top"><div align="left"><font face="Mangal"> 
    321/5
    </font> </div></td>
<td align="left" valign="top" bordercolor="#CCCCCC"> 
  0.063<br>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    321/5<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    0.063<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    रामनारायण पिता घीसालाल<br>जाति खाती<br>पता निवासी ग्राम<br>भूमि स्वामी<br>
    </font></div></td>

 </tr>

 <tr> 
 <td align="left" valign="top"><font face="Mangal"> 
  5
  </font></td>
<td height="29" align="left" valign="top"><div align="left"><font face="Mangal"> 
    353/11/1/1/1
    </font> </div></td>
<td align="left" valign="top" bordercolor="#CCCCCC"> 
  0.127<br>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    353/11/1/1/1<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    0.127<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    दुर्गाप्रसाद पिता केलाश<br>जाति चमार<br>पता निवासी ग्राम<br>भूमि स्वामी<br>
    </font></div></td>

  </tr>

 <tr> 
<td align="left" valign="top"><font face="Mangal"> 
  6
  </font></td>
<td height="29" align="left" valign="top"><div align="left"><font face="Mangal"> 
    141/1
    </font> </div></td>
<td align="left" valign="top" bordercolor="#CCCCCC"> 
  0.136<br>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    141/1<br>143/1<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    0.009<br>0.127<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    जीतमल पिता गोरेलाल<br>जाति रूवाला<br>पता निवासी ग्राम<br>भूमि स्वामी<br>
    </font></div></td>

</tr>

 <tr> 
<td align="left" valign="top"><font face="Mangal"> 
  7
  </font></td>
<td height="29" align="left" valign="top"><div align="left"><font face="Mangal"> 
    319/3/1
    </font> </div></td>
<td align="left" valign="top" bordercolor="#CCCCCC"> 
  0.167<br>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div>
  <div align="left"></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    319/3/1<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    0.167<br>
    </font></div></td>
<td align="left" valign="top"> <div align="left"><font face="Mangal"> 
    शिवनारायण पिता लक्ष्मनीरायण<br>जाति खाती<br>पता निवासी ग्राम<br>भूमि स्वामी<br>
    </font></div></td>

 </tr>
 </table> 

【问题讨论】:

  • 您是否显示正确的输出?我用你的 html 文件运行你的命令并得到以下输出:&gt; output[,4] [1] 214 321/2/1 321/5 353/11/1/1/1 141/1143/1 [6] 319/3/1 Levels: 141/1143/1 214 319/3/1 321/2/1 321/5 353/11/1/1/1.
  • 我想我在一开始就错过了额外的数据点......我更正了输出......

标签: html r screen-scraping html-table


【解决方案1】:

评论太长了。

问题在于您的 HTML,而不是 readHTMLTable(...)

首先,您的表格没有标题行,因此您应该在调用readHTMLTable(...) 时使用header=F。以这种方式处理,表有 7 行(例如,&lt;tr&gt; ... &lt;/tr&gt; 的 7 个实例。

第二,第6行,第4个单元格是:

<td>141/1<br>143/1<br></td>

也就是说,第 6 行第 4 列的内容由两个用换行符分隔的字符串组成。 readHTMLTable(...) 正确转换为“141/1143/1”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多