我用:
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}
答案 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