Импорт таблиц в Mathematica из Интернета - проблема с пустыми ячейками - PullRequest
7 голосов
/ 19 мая 2011

Я использую:
data=Import["http://weburl/","Data"]
импортировать данные с одного сайта. На этой странице есть таблицы. Это создает вложенные списки, и вы можете легко получить данные в виде таблицы. Например:
Grid[data[[1]]]
даст что-то вроде этого:

Player Age Shots Goals
  P1    24    10    2 
  P2    22     5    0
  P3    28    11    1
  ...

Теперь вот проблема. Если одна ячейка в html-таблице пуста, например, запись «Age», то в html это будет выглядеть так: <td></td>. Mathematica вообще не включает его в список, даже в качестве, например, значения «Null». Вместо этого эта строка будет просто представлена ​​списком длиной 3, а данные будут перемещены на один столбец, поэтому вместо «Возраст» и «Цели» вместо «Выстрелы» и «Цели» вы получите «Снимки». "будет пустым. Например, возраст «P4», чей возраст неизвестен (пустая ячейка в HTML-таблице), у которого было 10 выстрелов и забил 0 голов, будет импортирован как список длины 3, а не 4 и перемещен на единицу:

Player Age Shots Goals
  P1    24    10    2 
  P2    22     5    0
  P3    10     0  
  ...

Это создает трудную проблему, потому что, если у вас есть несколько пустых полей, вы не можете определить из списка, к какому столбцу он принадлежит. Есть ли способ поместить «пустое» значение в пустую ячейку в HTML-таблицах при импорте в Mathematica? Например, элемент P4 в списке будет выглядеть так:
data[[1,5]]
{"P4","Null",10,0}
вместо:
{"P4",10,0}

Ответы [ 3 ]

9 голосов
/ 19 мая 2011

Как указывает lumeng, вы можете использовать FullData для правильного заполнения HTML-элемента таблицы.Вот более простая иллюстрация этого.

in = ImportString["\<<html><table>
   <tr>
   <td>(1,1)</td>
   <td>(1,2)</td>
   <td>(1,3)</td>
   </tr>
   <tr>
   <td>(2,1)</td>
   <td></td>
   <td>(2,3)</td>
   </tr>
   </table></html>\>",
   {"HTML", "FullData"}];
Grid[in[[1, 1]]]

Если вы хотите более полный контроль над выводом, я бы предложил вам Import страницу в формате XML.Вот пример.

in = ImportString["\<<html><table>
    <tr>
    <td>(1,1)</td>
    <td>(1,2)</td>
    <td>(1,3)</td>
    </tr>
    <tr>
    <td>(2,1)</td>
    <td></td>
    <td>(2,3)</td>
    </tr>
    </table></html>\>", "XML"];
Column[Last /@ Cases[in,
   XMLElement["td", ___], Infinity]]

Вам нужно немного ознакомиться с XML в целом и версией Mathematica, а именно XMLObject.Работать с этим приятно, когда вы освоитесь.

5 голосов
/ 19 мая 2011
In[13]:= htmlcode = "<html><table border=\"1\">
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
<td>row 1, cell 3</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td></td>
<td>row 2, cell 3</td>
</tr>
</table><html>";

In[14]:= file = ToFileName[{$TemporaryDirectory}, "tmp.html"]
Out[14]= "/tmp/tmp.html"


In[15]:= OpenWrite[file]
WriteString[file,htmlcode]
Close[file]
FilePrint[file]
Out[15]= OutputStream[/tmp/tmp.html,18]
Out[17]= /tmp/tmp.html
During evaluation of In[15]:=
<html><table border="1">
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
<td>row 1, cell 3</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td></td>
<td>row 2, cell 3</td>
</tr>
</table><html>
In[23]:= Import[file,"Elements"]//InputForm
Out[23]//InputForm=
{"Data", "FullData", "Hyperlinks", "ImageLinks", "Images", "Plaintext", "Source", "Title", "XMLObject"}
In[22]:= Import[file,"FullData"]//InputForm
Out[22]//InputForm=
{{{{"row 1, cell 1", "row 1, cell 2", "row 1, cell 3"}, {"row 2, cell 1", "", "row 2, cell 3"}}}, {}}
3 голосов
/ 20 мая 2011

Используя образец Computist, вы также можете сделать:

htmlcode = "<html><table border=\"1\">
  <tr>
  <td>row 1, cell 1</td>
  <td>row 1, cell 2</td>
  <td>row 1, cell 3</td>
  </tr>
  <tr>
  <td>row 2, cell 1</td>
  <td></td>
  <td>row 2, cell 3</td>
  </tr>
  </table><html>";

StringReplace[htmlcode, "<td></td>" -> "<td>###</td>"];

ImportString[%, "Data"] /. "###" -> Null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...