首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Mathematica从HTML中提取信息

使用Mathematica从HTML中提取信息
EN

Stack Overflow用户
提问于 2012-01-11 04:07:30
回答 3查看 5.2K关注 0票数 18

有没有一种简单的方法可以使用Mathematica从特定的超文本标记语言表格中提取数据呢?Import似乎非常强大,而且Mathematica似乎能够很好地处理诸如XML之类的格式。

下面是一个例子:http://en.wikipedia.org/wiki/Unemployment_by_country

EN

回答 3

Stack Overflow用户

发布于 2012-01-11 04:59:01

虽然使用Import可能是一种更好、更健壮的方法,但我发现,至少对于这个特定的问题,我自己的HTML解析器(以this thread发布)可以很好地进行少量的后处理。如果你从那里获取代码并执行它,使用这个函数来增强它:

代码语言:javascript
复制
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[]}];

然后,我认为,您可以通过下面的代码获得相当完整的数据:

代码语言:javascript
复制
text = Import["http://en.wikipedia.org/wiki/Unemployment_by_country", "Text"];
myData = First@findAndParseTables[text];

下面是结果的外观:

代码语言:javascript
复制
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对象),通常很容易建立一组替换规则,在每种给定的情况下都能进行正确的后处理。最后一个免责声明是,我的解析器并不健壮,并且肯定包含许多错误,因此请注意。

票数 6
EN

Stack Overflow用户

发布于 2012-01-11 04:13:02

代码语言:javascript
复制
Import[
  "http://en.wikipedia.org/wiki/Unemployment_by_country",
  "Data"]

当然,结果经常需要进一步处理。您希望如何将其可视化?

您可以使用以下命令查找所有Import类型

代码语言:javascript
复制
Import[
  "http://en.wikipedia.org/wiki/Unemployment_by_country",
  "Elements"]
票数 5
EN

Stack Overflow用户

发布于 2012-01-11 08:11:07

如果你想导入...,"XMLObject“路线,这是你可以做的概述。

首先,获取页面:

代码语言:javascript
复制
page = Import["http://en.wikipedia.org/wiki/Unemployment_by_country", "XMLObject"];

接下来,获取感兴趣的表(在本例中,大表恰好也是此页面上七个表中的第一个):

代码语言:javascript
复制
table = Cases[page, XMLElement["table", ___], \[Infinity]][[1]]

接下来,从table中获取一个row,我选择了对应于阿尔及利亚的第四行:

row =Cases[表,XMLElement"tr",___,无穷大][4]

接下来,从该行提取表数据元素():

代码语言:javascript
复制
data = Cases[row, XMLElement["td", ___], \[Infinity]]

例如,您可以从这些元素中选取国家国旗缩略图,如下所示:

代码语言:javascript
复制
image = Cases[data, XMLElement["img", {___, "src" -> src_, ___}, _] :> src, \[Infinity]]

最后导入图像缩略图(由于某种原因,需要在前面加上"http:“):

代码语言:javascript
复制
Import["http:" <> image]

这是笔记本的外观(缩略图加上其他输入):

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8809812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档