有没有一个简单的方法来从特定的HTML表中使用Mathematica提取数据?进口似乎是非常强大的,而且Mathematica似乎能够很好地处理诸如XML之类的格式。
这里有一个例子:http://en.wikipedia.org/wiki/Unemployment_by_country
解决方法
有关这方面的一般例子,请参考以下内容:
>如何| Clean Up Data Imported from a ZIP File
>如何| Clean Up Data Imported from a Website
对于这个具体的例子,只需要导入它
tmp = Import["http://en.wikipedia.org/wiki/Unemployment_by_country","Data"]
清理它是相当简单的这个进口。该表是3列,从其余的东西中提取出来:
tmp1 = Cases[tmp,{_,_?NumberQ,_},\[Infinity]]
你可能想删除方括号引用(??):
tmp1[[All,3]] = Flatten[If[StringQ[#],StringCases[#,x__ ~~ Whitespace ~~ "[" ~~ __ :> x],#] & /@ tmp1[[All,3]]] Grid[tmp1,Frame -> All]
Grid[Join[{{"Country / Region","Unemployment rate (%)","Source / date of information"}},tmp1],Frame -> All]
纯粹主义者可能会反对最后一步,但是当你正在刮削数据时,你只是想完成这项工作,每个网站都是一个案例展望。所以一些手动检查和灵活性让您获得最快的整体效果。
编辑
如果你想要标志,你也可以从CountryData获取它们。需要进一步的清理,否则会发生大量的错误。清理涉及删除对括号中“主权国家”的引用。例如“关岛(美国)” – > “Gaum”。
tmp2 = Flatten[ If[StringMatchQ[#,__ ~~ "(" ~~ __],z__ ~~ Shortest["(" ~~ __ ~~ ")" ~~ EndOfString] :> StringTrim@z],StringTrim[#]] & /@ tmp1[[All,1]]]
这仍然会产生CountryData无法识别的输出。
flags = CountryData[#,"Flag"] & /@ tmp2; Cases[flags,_CountryData]
flags = If[Head[#] === CountryData,{""},{#}] & /@ flags; (*much faster than rule replacement*) tmp2 = Join[flags,tmp1,2]; Grid[tmp2,Frame -> All]
请注意,这需要一段时间才能呈现。
您可以根据需要明显地使用网格选项来设置网格,如果需要,还可以调整图像的大小。