有没有一种简单的方法可以使用Mathematica从特定的超文本标记语言表格中提取数据呢?Import
似乎非常强大,而且Mathematica似乎能够很好地处理诸如XML之类的格式。
下面是一个例子:http://en.wikipedia.org/wiki/Unemployment_by_country
发布于 2012-01-11 04:59:01
虽然使用Import
可能是一种更好、更健壮的方法,但我发现,至少对于这个特定的问题,我自己的HTML解析器(以this thread发布)可以很好地进行少量的后处理。如果你从那里获取代码并执行它,使用这个函数来增强它:
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}}]
我喜欢这种方法(而不是Import->XMLObject
)的原因是,因为我用最少的语法将网页转换成数学表达式(不像XML对象),通常很容易建立一组替换规则,在每种给定的情况下都能进行正确的后处理。最后一个免责声明是,我的解析器并不健壮,并且肯定包含许多错误,因此请注意。
发布于 2012-01-11 04:13:02
Import[
"http://en.wikipedia.org/wiki/Unemployment_by_country",
"Data"]
当然,结果经常需要进一步处理。您希望如何将其可视化?
您可以使用以下命令查找所有Import
类型
Import[
"http://en.wikipedia.org/wiki/Unemployment_by_country",
"Elements"]
发布于 2012-01-11 08:11:07
如果你想导入...,"XMLObject“路线,这是你可以做的概述。
首先,获取页面:
page = Import["http://en.wikipedia.org/wiki/Unemployment_by_country", "XMLObject"];
接下来,获取感兴趣的表(在本例中,大表恰好也是此页面上七个表中的第一个):
table = Cases[page, XMLElement["table", ___], \[Infinity]][[1]]
接下来,从table
中获取一个row
,我选择了对应于阿尔及利亚的第四行:
row =Cases[表,XMLElement"tr",___,无穷大][4]
接下来,从该行提取表数据元素():
data = Cases[row, XMLElement["td", ___], \[Infinity]]
例如,您可以从这些元素中选取国家国旗缩略图,如下所示:
image = Cases[data, XMLElement["img", {___, "src" -> src_, ___}, _] :> src, \[Infinity]]
最后导入图像缩略图(由于某种原因,需要在前面加上"http:“):
Import["http:" <> image]
这是笔记本的外观(缩略图加上其他输入):
https://stackoverflow.com/questions/8809812
复制相似问题