从Web导入Mathematica中的表 - 空单元格问题

时间:2011-05-19 17:50:57

标签: import wolfram-mathematica

我用:
data=Import["http://weburl/","Data"]
从一个站点导入数据。在该页面上有表格。这将创建嵌套列表,您可以轻松地以表格形式获取数据。例如:
Grid[data[[1]]]
会给出这样的东西:

Player Age Shots Goals
  P1    24    10    2 
  P2    22     5    0
  P3    28    11    1
  ...

现在,这是问题所在。如果html表中的一个单元格为空,例如“Age”的条目,则在html中,这将如下所示:<td></td>。 Mathematica根本不包括在列表中,甚至不包括例如“Null”值。相反,这一行只是由长度为3的列表表示,数据将被移动一列,因此您将获得“镜头”代替“年龄”和“目标”代替“镜头”和“目标” “会空的。 例如,年龄未知的“P4”(html表格中的空单元格),有10个镜头并且得分为0的目标将被导入为长度3而不是4的列表并且移动一个:

Player Age Shots Goals
  P1    24    10    2 
  P2    22     5    0
  P3    10     0  
  ...

这会带来一个难题,因为如果您有一些空字段,那么您无法从列表中分辨出它属于哪一列。在Mathematica中导入时,有没有办法在html表中的空单元格上放置“Null”?例如,列表中的P4元素将如下所示:
data[[1,5]]
{"P4","Null",10,0}
而不是:
{"P4",10,0}

3 个答案:

答案 0 :(得分:9)

正如lumeng指出的那样,您可以使用FullData来正确填写HTML表格元素。以下是对此的简单说明。

in = ImportString["\<<html><table>
   <tr>
   <td>(1,1)</td>
   <td>(1,2)</td>
   <td>(1,3)</td>
   </tr>
   <tr>
   <td>(2,1)</td>
   <td></td>
   <td>(2,3)</td>
   </tr>
   </table></html>\>",
   {"HTML", "FullData"}];
Grid[in[[1, 1]]]

如果您想要更完整地控制输出,我建议您将页面Import作为XML。这是一个例子。

in = ImportString["\<<html><table>
    <tr>
    <td>(1,1)</td>
    <td>(1,2)</td>
    <td>(1,3)</td>
    </tr>
    <tr>
    <td>(2,1)</td>
    <td></td>
    <td>(2,3)</td>
    </tr>
    </table></html>\>", "XML"];
Column[Last /@ Cases[in,
   XMLElement["td", ___], Infinity]]

您需要阅读一般的XML和Mathematica的版本,即XMLObject。但是,一旦掌握了它,它就会很愉快。

答案 1 :(得分:5)

In[13]:= htmlcode = "<html><table border=\"1\">
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
<td>row 1, cell 3</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td></td>
<td>row 2, cell 3</td>
</tr>
</table><html>";

In[14]:= file = ToFileName[{$TemporaryDirectory}, "tmp.html"]
Out[14]= "/tmp/tmp.html"


In[15]:= OpenWrite[file]
WriteString[file,htmlcode]
Close[file]
FilePrint[file]
Out[15]= OutputStream[/tmp/tmp.html,18]
Out[17]= /tmp/tmp.html
During evaluation of In[15]:=
<html><table border="1">
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
<td>row 1, cell 3</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td></td>
<td>row 2, cell 3</td>
</tr>
</table><html>
In[23]:= Import[file,"Elements"]//InputForm
Out[23]//InputForm=
{"Data", "FullData", "Hyperlinks", "ImageLinks", "Images", "Plaintext", "Source", "Title", "XMLObject"}
In[22]:= Import[file,"FullData"]//InputForm
Out[22]//InputForm=
{{{{"row 1, cell 1", "row 1, cell 2", "row 1, cell 3"}, {"row 2, cell 1", "", "row 2, cell 3"}}}, {}}

答案 2 :(得分:3)

使用Computist的示例,你也可以这样做:

htmlcode = "<html><table border=\"1\">
  <tr>
  <td>row 1, cell 1</td>
  <td>row 1, cell 2</td>
  <td>row 1, cell 3</td>
  </tr>
  <tr>
  <td>row 2, cell 1</td>
  <td></td>
  <td>row 2, cell 3</td>
  </tr>
  </table><html>";

StringReplace[htmlcode, "<td></td>" -> "<td>###</td>"];

ImportString[%, "Data"] /. "###" -> Null