如何使用Mathematica从HTML中提取信息?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

有没有简单的方法使用Mathematica从特定的HTML表格中提取数据? Import似乎非常强大,Mathematica似乎能够很好地处理XML等格式。

提问于
用户回答回答于

导入

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[#, __ ~~ "(" ~~ __], 
     StringCases[#, 
      z__ ~~ Shortest["(" ~~ __ ~~ ")" ~~ EndOfString] :> 
       StringTrim@z], StringTrim[#]] & /@ tmp1[[All, 1]]]

这仍然会产生一些CountryData无法识别的输出。

flags = CountryData[#, "Flag"] & /@ tmp2;
Cases[flags, _CountryData]

在190中失误6次。从输出中删除这些失误:

flags = If[Head[#] === CountryData, {""}, {#}] & /@ flags; (*much faster than rule replacement*)
tmp2 = Join[flags, tmp1, 2];
Grid[tmp2, Frame -> All]

请注意,这需要一段时间才能呈现。

你可以Grid根据需要使用Grid选项来显式设置样式,并根据需要调整图像大小。

用户回答回答于

虽然使用Import可能是一种更好,更强大的方式

也可以用这个函数来扩充它:

Clear[findAndParseTables];
findAndParseTables[text_String] :=
  Module[{parsed = postProcess@parseText[text]},
    DeleteCases[
      Cases[parsed, _tableContainer, Infinity],
      _attribContainer | _spanContainer, Infinity
    ] //.
    {(supContainer | tdContainer | trContainer | thContainer)[x___] :> {x},
        iContainer[x___] :> x,
        aContainer[x_] :> x,
        "\n" :> Sequence[],
       divContainer[] | ulContainer[] | liContainer[] | aContainer[] :> Sequence[]}];

然后,你会得到这个代码的非常完整的数据:

text = Import["http://en.wikipedia.org/wiki/Unemployment_by_country", "Text"];
myData = First@findAndParseTables[text];

以下是结果的外观:

In[92]:= Short[myData,5]
Out[92]//Short= 
tableContainer[{{Country / Region},{Unemployment rate (%)},{Source / date of information}},
{{Afghanistan},{35.0},{2008,{3}}},{{Albania},{13.49},{2010 (Q4),{4}}},
{{Algeria},{10.0},{2010 (September),{5}}},<<188>>,{{West Bank},{17.2},{2010,{43}}},
{{Yemen},{35.0},{2009 (June),{128}}},{{Zambia},{16.0},{2005,{129}}},{{Zimbabwe},{97.0},{2009}}]

扫码关注云+社区