wolfram mathematica legends axeslabel wolfram-mathematica

wolfram-mathematica - legends - wolfram mathematica label axis



Extraer informaciĆ³n de HTML utilizando Mathematica (6)

¿Existe una manera fácil de extraer datos de tablas HTML específicas utilizando Mathematica? Import parece ser bastante poderosa, y Mathematica parece ser capaz de manejar formatos como XML bastante bien.

Aquí hay un ejemplo: http://en.wikipedia.org/wiki/Unemployment_by_country


No es una respuesta directa a cómo importar HTML (lo que otros han explicado bien), pero obtener datos de tablas HTML es precisamente la razón por la que originalmente hice mi paleta de pegado de tablas .

Si su objetivo es obtener los datos, esto probablemente será más fácil y rápido que tratar de analizar la página.

Instrucciones de uso de la paleta.

  1. Evalúe la expresión que crea la paleta, vaya a Paletas -> Instalar paleta ... y guárdela permanentemente para su uso posterior (si lo desea).

  2. Seleccione una parte de la tabla en la página web. Si está trabajando con Firefox, mantenga presionada la tecla CTRL para seleccionar cualquier sección rectangular de la tabla (¡muy útil!) Cópielo.

  3. Si está utilizando Firefox o Chrome, presione el botón TSV en la paleta para pegar los datos en el cuaderno en el punto de inserción actual. No estoy seguro de si otros navegadores también separan los elementos con pestañas al copiar.

El resultado se verá así:

{{"Afghanistan", 35.`, "2008[3]"}, {"Albania", 13.49`, "2010 (Q4)[4]"}, {"Algeria", 10.`, "2010 (September)[5]"}, {"American Samoa (United States)", 23.8`, "2010[3]"}, {"Andorra", 2.9`, 2009}}

Como puede ver, se necesita algo de procesamiento posterior para convertir los años a un formato adecuado (¿una cadena o un entero?)

Este es el antiguo código de paleta. Me doy cuenta de que se necesita una limpieza, pero funciona como es, y aún no he tenido tiempo de arreglarlo. Informe cualquier problema en los comentarios a continuación.

CreatePalette@Column@{Button["TSV", Module[{data, strip}, data = NotebookGet[ClipboardNotebook[]][[1, 1, 1]]; strip[s_String] := StringReplace[s, RegularExpression["^//s*(.*?)//s*$"] -> "$1"]; strip[e_] := e; If[Head[data] === String, NotebookWrite[InputNotebook[], ToBoxes@Map[strip, ImportString[data, "TSV"], {2}]] ] ] ], Button["CSV", Module[{data, strip}, data = NotebookGet[ClipboardNotebook[]][[1, 1, 1]]; strip[s_String] := StringReplace[s, RegularExpression["^//s*(.*?)//s*$"] -> "$1"]; strip[e_] := e; If[Head[data] === String, NotebookWrite[InputNotebook[], ToBoxes@Map[strip, ImportString[data, "CSV"], {2}]] ] ] ], Button["Table", Module[{data}, data = NotebookGet[ClipboardNotebook[]][[1, 1, 1]]; If[Head[data] === String, NotebookWrite[InputNotebook[], ToBoxes@ImportString[data, "Table"]] ] ] ]}


Para ciertos valores de ''fácil'', sí. Vea aquí: HTML Importar documentación para Mathematica 8.

Puede importar desde tablas utilizando la opción de formato "Data" , por ejemplo, Import["file.hml", "Data"] . Eso es un comienzo, pero su enlace es un valor completo de tablas, divs y otras cosas de DOM-tree. Está documentado, pero poco, y tendrías que experimentar. Aunque funciona con URLs.

Esto realmente funciona . Con un poco de limpieza puedes usar los datos aquí:

Import["http://en.wikipedia.org/wiki/Unemployment_by_country", "Data"]


Para ejemplos generales de esto hay estos consejos para:

Para este ejemplo específico solo importalo

tmp = Import["http://en.wikipedia.org/wiki/Unemployment_by_country", "Data"]

Limpiarlo es bastante sencillo con esta importación. La tabla es de 3 columnas, así que sácala del resto de cosas:

tmp1 = Cases[tmp, {_, _?NumberQ, _}, /[Infinity]]

Probablemente querrá eliminar las referencias entre corchetes (??):

tmp1[[All, 3]] = Flatten[If[StringQ[#], StringCases[#, x__ ~~ Whitespace ~~ "[" ~~ __ :> x], #] & /@ tmp1[[All, 3]]] Grid[tmp1, Frame -> All]

Tenga en cuenta que también puede volver a agregar el encabezado si lo desea en su tabla, lo que probablemente haga

Grid[Join[{{"Country / Region", "Unemployment rate (%)", "Source / date of information"}}, tmp1], Frame -> All]

los puristas pueden objetar el último paso, pero cuando está raspando los datos, generalmente solo desea hacer el trabajo y cada sitio es un caso por caso. Así que un poco de inspección manual y flexibilidad le da el resultado general más rápido.

Editar

Si quisieras las banderas también podrías obtenerlas de CountryData . Se necesita algo de limpieza adicional, de lo contrario se producirán muchos errores. La limpieza implica eliminar la referencia al "país soberano" entre paréntesis. por ejemplo, "Guam (Estados Unidos)" -> "Gaum".

tmp2 = Flatten[ If[StringMatchQ[#, __ ~~ "(" ~~ __], StringCases[#, z__ ~~ Shortest["(" ~~ __ ~~ ")" ~~ EndOfString] :> StringTrim@z], StringTrim[#]] & /@ tmp1[[All, 1]]]

Esto todavía producirá una salida que CountryData no reconoce.

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

6 faltan de 190. Elimina esas faltas de la salida:

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

Tenga en cuenta que esto tarda un poco en renderizar.

Obviamente, puede personalizar el Grid como lo desee utilizando Grid opciones de Grid y también cambiar el tamaño de las imágenes si es necesario.


Si bien el uso de Import es probablemente una forma mejor y más robusta, descubrí que, al menos para este problema en particular, mi propio analizador HTML (publicado en este hilo ) funciona bien con una pequeña cantidad de procesamiento posterior. Si toma el código desde allí y lo ejecuta, aumentándolo con esta función:

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[]}];

Entonces obtienes, creo, datos bastante completos por este código:

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

Así es como se ve el resultado:

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}}]

Lo que me gusta de este enfoque (en contraposición a decir, Import->XMLObject ) es que, dado que convierto la página web en una expresión de Mathematica con una sintaxis mínima (a diferencia de, por ejemplo, los objetos XML), a menudo es muy fácil establecer un conjunto de reemplazo. Reglas que hacen el correcto post-procesamiento en cada caso dado. Un descargo de responsabilidad final es que mi analizador no es robusto y que sin duda contiene una serie de errores, por lo que se le advierte.


Si desea ir a la ruta Importar [..., "XMLObject"], aquí tiene un resumen de lo que puede hacer.

En primer lugar, obtener la página:

page = Import["http://en.wikipedia.org/wiki/Unemployment_by_country", "XMLObject"];

A continuación, obtenga la tabla de interés (en este caso, la tabla grande también es la primera de las siete tablas de esta página):

table = Cases[page, XMLElement["table", ___], /[Infinity]][[1]]

A continuación, obtener una row de la table , elegí la cuarta fila que corresponde con Argelia:

row = Cases [table, XMLElement ["tr", ___], [Infinity]] [[4]]

A continuación, extraiga los elementos de datos de la tabla () de esta fila:

data = Cases[row, XMLElement["td", ___], /[Infinity]]

De esos elementos, puede elegir, por ejemplo, la miniatura de la bandera del país, así:

image = Cases[data, XMLElement["img", {___, "src" -> src_, ___}, _] :> src, /[Infinity]]

Por último, importe esa miniatura de la imagen (por alguna razón se necesitaba "http:" antepuesta):

Import["http:" <> image]

Este es el aspecto del portátil (la miniatura, más las otras entradas):


Import[ "http://en.wikipedia.org/wiki/Unemployment_by_country", "Data"]

Por supuesto, el resultado con frecuencia necesitará más procesamiento. ¿Cómo quieres visualizarlo?

Puedes encontrar todos Import tipos de Import usando

Import[ "http://en.wikipedia.org/wiki/Unemployment_by_country", "Elements"]