Динамический массив в JSON или Таблица в JSON - PullRequest
0 голосов
/ 21 сентября 2019

Я искал и пытался заставить это работать в течение нескольких недель, и я все еще терплю неудачу.Я пробовал несколько способов, включая выражения reg.У меня есть динамическая таблица, которую я обрабатываю кукловодом, и я пытаюсь вывести эти данные в формате JSON.Проблема в том, что заголовок "2nd flr (Rm 226)" & 'Location - Room 115' может отображаться или не отображаться.События в этих комнатах могут иметь 1 или несколько событий.Как мне преобразовать динамические данные, как это, и убедиться, что я получаю все в списке?

Я пытаюсь получить что-то вроде этого JSON.

data: [

  {
    "location": "2nd flr (Rm 226)"
    "time": "10:00 AM",
    "description": "Social Security Administration Commissioner",
    "document": "18",
    "type": "Social Security Hearing",
    "blank": " ",
    "order": "Hearing"
  },
  {
    "location": "2nd flr (Rm 226)"
    "time": "01:00 PM",
    "description:"
    "Social Security Administration Commissioner",
    "document": "18",
    "type": "Order Setting Social Security Hearing",
    "blank": " ",
    order: "Hearing"

  },
  {
    "location": "3rd flr (100)"
    "time": "01:00 PM",
    "description:"
    "Social Security Administration Commissioner",
    "document": "18",
    "type": "Order Setting Social Security Hearing",
    "blank": " ",
    order: "Hearing"

  }

]


const data = Array.from(
  document.querySelectorAll('#content > table > tbody > tr'),
  row => Array.from(row.querySelectorAll('td'), cell => cell.innerText)
)

Вот вывод, который я получаю.

{
  "data": [
    [
      "2nd flr (Rm 226)"
    ],
    [
      "10:00 AM",
      "Social Security Administration Commissioner",
      "18",
      "Social Security Hearing",
      " ",
      "Hearing"
    ],
    [
      "01:00 PM",
      "Social Security Administration Commissioner",
      "18",
      "Order Setting Social Security Hearing",
      " ",
      "Hearing"
    ],
    [
      "3rd flr (100)"
    ],
    [
      "09:30 AM",
      "TERMINATED on 03/23/2015",
      "34",
      "Resetting Hearings",
      " ",
      "Hearing"
    ],
    [
      " ",
      "Reserved for case",
      "23",
      "Motion Hearing",
      " ",
      "Hearing"
    ],
    [
      "01:00 PM",
      "Case Information",
      "19",
      "Order Setting",
      " ",
      "Hearing"
    ],
    [
      "01:30 PM",
      "Case information",
      "31",
      "Order Setting",
      " ",
      "Hearing"
    ],
    [
      " ",
      "TERMINATED on 06/14/2019",
      "16",
      "Order Setting/Resetting Hearings",
      " ",
      "Hearing"
    ],
    [
      "3rd flr (Rm 310)"
    ],
    [
      "01:30 PM",
      "Insurance Company",
      "122",
      "Order Setting/Resetting Hearings",
      " ",
      "Hearing"
    ]
  ]
}
<center><Table border=1 width=98%>
<TR><TD id='report' class='report' align=center><B><FONT SIZE=+2>Daily Calendar Report of 09/23/2019</font></B><BR><CENTER></table></center>
<Table border=1 width=98%   >

<TR><TD class='room' id='room' ALIGN=CENTER COLSPAN=6><STRONG>2nd flr (Rm 226)</STRONG></TD></TR>
<TR id='casedata' class='casedata'>
<TD class=case-0 id=case-0 VALIGN=top NOWRAP>10:00 AM</TD>
<TD class=case-1 id=case-1 VALIGN=top><A HREF=/Reportpt.pl?55244>Social Security Administration</A><B></B></TD>
<TD class=case-2 id=case-2 VALIGN=top>18</TD>
<TD class=case-3 id=case-3 VALIGN=top>Security Hearing</TD>
<TD class=case-4 id=case-4 VALIGN=top>&nbsp</TD>
<TD class=case-5 id=case-5 VALIGN=top NOWRAP><I>Hearing</I></TD>
</TR>

<TR><TD class='room' id='room' ALIGN=CENTER COLSPAN=6><STRONG>2nd flr (Rm 406)</STRONG></TD></TR>
<TR id='casedata' class='casedata'>
<TD class=case-0 id=case-0 VALIGN=top NOWRAP>1:30 PM</TD>
<TD class=case-1 id=case-1 VALIGN=top><A HREF=/Reportpt.pl?55244>Social Security Administration</A><B></B></TD>
<TD class=case-2 id=case-2 VALIGN=top>18</TD>
<TD class=case-3 id=case-3 VALIGN=top>Security Hearing</TD>
<TD class=case-4 id=case-4 VALIGN=top>&nbsp</TD>
<TD class=case-5 id=case-5 VALIGN=top NOWRAP><I>Hearing</I></TD>
</TR>
</table>
const tds = Array.from(document.querySelectorAll('#Content > table > tbody > tr > td'));
const trs = Array.from(document.querySelectorAll('#Content > table > tbody > tr'))

const data = Array.from(
      document.querySelectorAll('#Content > table > tbody > tr'),
      row => Array.from(row.querySelectorAll('td'), cell => cell.innerText),
      data =>{ return ( [data] ) }
    )

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Вам нужно искать дополнительные подсказки в своем HTML, чтобы достичь желаемой структуры.В этом случае я искал класс первого td в каждом tr.

[[Я знаю, что вы только читаете HTML, но он неисправен, поскольку в нем есть несколько идентичных id с (room) ...]]

// define shortcut function qsa: querySelectorAll, returning a proper array
// An HTML context `el` can be given as an optional second parameter
function qsa(s,el){
 return Array.prototype.map.call((el?Element:Document).prototype
             .querySelectorAll.call((el||document),s),function(e){return e})
}
data=[];
qsa('tr').forEach(function(tr,i,arr){
 var tds=qsa('td',tr); 
 if (tds[0].className=='room') 
  arr.room=tds[0].innerText // "remember" the current room data ...
 else if (tds[0].className=='case-0') 
  data.push([arr.room].concat(tds.map(function(e){return e.innerText}))) // output room and row data
});

console.log(data)

// and, of course, the JSON is created by
var JSONdata=JSON.stringify(data);
<center><Table border=1 width=98%>
<TR><TD id='report' class='report' align=center><B><FONT SIZE=+2>Daily Calendar Report of 09/23/2019</font></B><BR><CENTER></table></center>
<Table border=1 width=98%   >

<TR><TD class='room' id='room' ALIGN=CENTER COLSPAN=6><STRONG>2nd flr (Rm 226)</STRONG></TD></TR>
<TR id='casedata' class='casedata'>
<TD class=case-0 id=case-0 VALIGN=top NOWRAP>10:00 AM</TD>
<TD class=case-1 id=case-1 VALIGN=top><A HREF=/Reportpt.pl?55244>Social Security Administration</A><B></B></TD>
<TD class=case-2 id=case-2 VALIGN=top>18</TD>
<TD class=case-3 id=case-3 VALIGN=top>Security Hearing</TD>
<TD class=case-4 id=case-4 VALIGN=top>&nbsp</TD>
<TD class=case-5 id=case-5 VALIGN=top NOWRAP><I>Hearing</I></TD>
</TR>

<TR><TD class='room' id='room' ALIGN=CENTER COLSPAN=6><STRONG>2nd flr (Rm 406)</STRONG></TD></TR>
<TR id='casedata' class='casedata'>
<TD class=case-0 id=case-0 VALIGN=top NOWRAP>1:30 PM</TD>
<TD class=case-1 id=case-1 VALIGN=top><A HREF=/Reportpt.pl?55244>Social Security Administration</A><B></B></TD>
<TD class=case-2 id=case-2 VALIGN=top>18</TD>
<TD class=case-3 id=case-3 VALIGN=top>Security Hearing</TD>
<TD class=case-4 id=case-4 VALIGN=top>&nbsp</TD>
<TD class=case-5 id=case-5 VALIGN=top NOWRAP><I>Hearing</I></TD>
</TR>
</table>

Это решение может показаться старомодным (без Array.from, без функций со стрелками).Я написал это так, что он все еще будет работать в IE.

0 голосов
/ 22 сентября 2019

Не думаю, что у вас правильный титул.Получить json легко, просто используйте JSON.stringify Ваша проблема заключается в том, чтобы объекты, которые вы хотите преобразовать, были согласованными или, по крайней мере, так, как вы этого хотите - похоже, код генерирует множество массивов, а не массив объектов

Так что я думаю, что вам нужно больше работать над парсингом html.Я бы утешил логи объектов, пришедших из html, чтобы проверить это перед конвертацией в json

Таким образом, вы можете прочитать каждый <td> явно, а не в цикле, присваивая либо значение объекту, либо значение по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...