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

ene*_*ene 7 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
  ...
Run Code Online (Sandbox Code Playgroud)

现在,这是问题所在.如果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  
  ...
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ure 9

正如lumeng指出的那样,您可以使用FullDataHTML表格元素来正确填写.这是一个更简单的说明.

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]]]
Run Code Online (Sandbox Code Playgroud)

如果您想要更完整地控制输出,我建议您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]]
Run Code Online (Sandbox Code Playgroud)

你需要阅读一般的XML和Mathematica的版本,即XMLObject.不过,一旦你掌握了它,这是一件很愉快的事情.

  • 您在示例字符串中使用的`"\ <... \>"`语法是什么意思? (3认同)
  • @WReach.此表单可以正确识别换行符,因此在输入文本块时通常会使用它. (2认同)

Men*_* Lu 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"}}}, {}}
Run Code Online (Sandbox Code Playgroud)