php - PHP获取url内容然后将表中的元素解析为JSON
问题描述
我在解析从另一个 URL 获取然后解析为 json 的 HTML 表时遇到问题。问题是在我的 url 页面中我有两个表并且在我的代码中它总是抓取这两个表但我只想要表 1 这样就会弄乱整个返回的 json
我尝试了一些人的解决方案来使用“->item (0)”,但它对我不起作用。
Hello,
I'm having a problem parsing a HTML table that i'm getting from another URL and then parsing in into a json. the problem
is that in my url page I have two tables and on my code it always grabs the two tables but I only want table 1. so that
messes up the whole returned json
<div id="d" class="div1">
<table class="example-table" width="100%">
<sec>
<thead>
<tr>
<th>Category</th>
<th>Admission Type</th>
<th>Facility</th>
<th>Facility Plus</th>
<th>All Facility</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="5">Adult<br><span style="font-weight: normal; font-size: .93em;">18-64 years</span>
</td>
<td class="label adult single">Single Admission</td>
<td class=" centres-no tcrc-no single">$111</td>
<td class=" centres-yes tcrc-no single">$115</td>
<td class=" centres-yes tcrc-yes single">$110</td>
</tr>
<tr>
<td class="hidden">Adult<br><span style="font-weight: normal; font-size: .93em;">18-64 years</span>
</td>
<td class="label adult multi">Multi per visit (5+)* </td>
<td class=" centres-no tcrc-no multi">$75</td>
<td class=" centres-yes tcrc-no multi">$925</td>
<td class=" centres-yes tcrc-yes multi">$15</td>
</tr>
<tr>
<td class="hidden">Adult<br><span style="font-weight: normal; font-size: .93em;">18-64 years</span>
</td>
<td class="label adult monthly">Regular 1 month pass</td>
<td class=" centres-no tcrc-no monthly">$551</td>
<td class=" centres-yes tcrc-no monthly">$710</td>
<td class=" centres-yes tcrc-yes monthly">$714</td>
</tr>
<tr>
<td class="hidden">Adult<br><span style="font-weight: normal; font-size: .93em;">18-64 years</span>
</td>
<td class="label adult continuous">Continuous monthly </td>
<td class=" centres-no tcrc-no continuous">$415</td>
<td class=" centres-yes tcrc-no continuous">$610</td>
<td class=" centres-yes tcrc-yes continuous">$615</td>
</tr>
<tr>
<td class="hidden">Adult<br><span style="font-weight: normal; font-size: .93em;">18-64 years</span>
</td>
<td class="label adult annual">Annual </td>
<td class=" centres-no tcrc-no annual">$480</td>
<td class=" centres-yes tcrc-no annual">$624</td>
<td class=" centres-yes tcrc-yes annual">$686</td>
</tr>
<tr>
<td rowspan="5">Youth/Senior<br><span style="font-weight: normal; font-size: .93em;">15-15/65+
years</span></td>
<td class="label youth-senior single">Single Admission</td>
<td class="dropin-yes centres-no tcrc-no single">$7</td>
<td class="dropin-yes centres-yes tcrc-no single">$8.75</td>
<td class="dropin-yes centres-yes tcrc-yes single">$9</td>
</tr>
<tr>
<td class="hidden">Youth/Senior<br><span style="font-weight: normal; font-size: .93em;">15-15/65+
years</span></td>
<td class="label youth-senior multi">Multi per visit (5+)* </td>
<td class="dropin-yes centres-no tcrc-no multi">$6.30</td>
<td class="dropin-yes centres-yes tcrc-no multi">$7.90</td>
<td class="dropin-yes centres-yes tcrc-yes multi">$8.10</td>
</tr>
<tr>
<td class="hidden">Youth/Senior<br><span style="font-weight: normal; font-size: .93em;">15-15/65+
years</span></td>
<td class="label youth-senior monthly">Regular 1 month pass </td>
<td class="dropin-yes centres-no tcrc-no monthly">$46</td>
<td class="dropin-yes centres-yes tcrc-no monthly">$59</td>
<td class="dropin-yes centres-yes tcrc-yes monthly">$61</td>
</tr>
<tr>
<td class="hidden">Youth/Senior<br><span style="font-weight: normal; font-size: .93em;">15-15/65+
years</span></td>
<td class="label youth-senior continuous">Continuous monthly </td>
<td class="dropin-yes centres-no tcrc-no continuous">$40</td>
<td class="dropin-yes centres-yes tcrc-no continuous">$50</td>
<td class="dropin-yes centres-yes tcrc-yes continuous">$51</td>
</tr>
<tr>
<td class="hidden">Youth/Senior<br><span style="font-weight: normal; font-size: .93em;">15-15/65+
years</span></td>
<td class="label youth-senior annual">Annual</td>
<td class="dropin-yes centres-no tcrc-no annual">$1414</td>
<td class="dropin-yes centres-yes tcrc-no annual">$1414</td>
<td class="dropin-yes centres-yes tcrc-yes annual">$141</td>
</tr>
<tr>
<td rowspan="5">Child<br><span style="font-weight: normal; font-size: .93em;">2-10 years</span></td>
<td class="label child single">Single Admission</td>
<td class=" centres-no tcrc-no single">$44</td>
<td class=" centres-yes tcrc-no single">$44</td>
<td class=" centres-yes tcrc-yes single">$777</td>
</tr>
<tr>
<td class="hidden">Child<br><span style="font-weight: normal; font-size: .93em;">2-10 years</span>
</td>
<td class="label child multi">Multi per visit (5+)*</td>
<td class=" centres-no tcrc-no multi">$14</td>
<td class=" centres-yes tcrc-no multi">$14</td>
<td class=" centres-yes tcrc-yes multi">$14</td>
</tr>
<tr>
<td class="hidden">Child<br><span style="font-weight: normal; font-size: .93em;">2-10 years</span>
</td>
<td class="label child monthly">Regular 1 Month Pass</td>
<td class=" centres-no tcrc-no monthly">$737</td>
<td class=" centres-yes tcrc-no monthly">$746</td>
<td class=" centres-yes tcrc-yes monthly">$748</td>
</tr>
<tr>
<td class="hidden">Child<br><span style="font-weight: normal; font-size: .93em;">2-10 years</span>
</td>
<td class="label child continuous">Continuous monthly</td>
<td class=" centres-no tcrc-no continuous">$544</td>
<td class=" centres-yes tcrc-no continuous">$450</td>
<td class=" centres-yes tcrc-yes continuous">$471</td>
</tr>
<tr>
<td class="hidden">Child<br><span style="font-weight: normal; font-size: .93em;">2-10 years</span>
</td>
<td class="label child annual">Annual</td>
<td class=" centres-no tcrc-no annual">$785</td>
<td class=" centres-yes tcrc-no annual">$785</td>
<td class=" centres-yes tcrc-yes annual">$6936</td>
</tr>
<tr>
<td rowspan="5">Family<br></td>
<td class="label family single">Single Admission</td>
<td class=" centres-no tcrc-no single">$785</td>
<td class=" centres-yes tcrc-no single">$875</td>
<td class=" centres-yes tcrc-yes single">$52</td>
</tr>
<tr>
<td class="hidden">Family<br></td>
<td class="label family multi">Multi per visit (5+)* </td>
<td class=" centres-no tcrc-no multi">$000</td>
<td class=" centres-yes tcrc-no multi">$120</td>
<td class=" centres-yes tcrc-yes multi">$2222</td>
</tr>
<tr>
<td class="hidden">Family<br></td>
<td class="label family monthly">Regular 1 month pass </td>
<td class=" centres-no tcrc-no monthly">$000</td>
<td class=" centres-yes tcrc-no monthly">$111</td>
<td class=" centres-yes tcrc-yes monthly">$222</td>
</tr>
<tr>
<td class="hidden">Family<br></td>
<td class="label family continuous">monthly </td>
<td class=" centres-no tcrc-no continuous">$000</td>
<td class=" centres-yes tcrc-no continuous">$111</td>
<td class=" centres-yes tcrc-yes continuous">$222</td>
</tr>
<tr>
<td class="hidden">Family<br></td>
<td class="label family annual">Annual </td>
<td class=" centres-no tcrc-no annual">$000</td>
<td class=" centres-yes tcrc-no annual">$111</td>
<td class=" centres-yes tcrc-yes annual">$222</td>
</tr>
</tbody>
</sec>
</table>
</div>
<table class="contactListing">
<tbody>
<tr>
<th>Online</th>
<td><a title="Contact" href="#" class="#">Contact Us Online</a></td>
</tr>
</tbody>
</table>
<table data-updated="" summary="Contact information">
<tbody>
<tr>
<th scope="row">Telephone</th>
<td>
<p><br />Outside City: 414141414</p>
</td>
</tr>
<tr>
<th scope="row">TTY</th>
<td>121212425</td>
</tr>
<tr>
<th scope="row">Email</th>
<td><a href="mailto:44@gmail.com">44@gmail.com</a></td>
</tr>
</tbody>
</table>
这是我的 php 代码
<?php
try {
error_reporting(0);
$htmlContent = file_get_contents("http://localhost:8080/samir/table.html");
$DOM = new DOMDocument();
$DOM->loadHTML($htmlContent);
$Header = $DOM->getElementsByTagName('th');
$Detail = $DOM->getElementsByTagName('td');
//#Get header name of the table
foreach($Header as $NodeHeader)
{
$aDataTableHeaderHTML[] = trim($NodeHeader->textContent);
}
//#Get row data/detail table without header name as key
$i = 0;
$j = 0;
foreach($Detail as $sNodeDetail)
{
$aDataTableDetailHTML[$j][] = trim($sNodeDetail->textContent);
$i = $i + 1;
$j = $i % count($aDataTableHeaderHTML) == 0 ? $j + 1 : $j;
}
//print_r($aDataTableDetailHTML); die();
//#Get row data/detail table with header name as key and outer array index as row number
for($i = 0; $i < count($aDataTableDetailHTML); $i++)
{
for($j = 0; $j < count($aDataTableHeaderHTML); $j++)
{
$aTempData[$i][$aDataTableHeaderHTML[$j]] = $aDataTableDetailHTML[$i][$j];
}
}
$aDataTableDetailHTML = $aTempData; unset($aTempData);
print_r($aDataTableDetailHTML); die();
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
Array ( [0] => Array ( [Category] => $10.35 [Admission Type] => Adult18-64 years [Facility] => Regular 1 month pass [Facility Plus] => $55 [All Facility] => $70 [Online] => Adult18-64 years [Telephone] => Multi per visit (5+)* [TTY] => $7.45 [Email] => $9.25 ) [1] => Array ( [Category] => $624 [Admission Type] => $686 [Facility] => Youth/Senior15-15/65+ years [Facility Plus] => Single Admission [All Facility] => $7 [Online] => $65 [Telephone] => Adult18-64 years [TTY] => Annual [Email] => $480 ) [2] => Array ( [Category] => $46 [Admission Type] => $59 [Facility] => $61 [Facility Plus] => Youth/Senior15-15/65+ years [All Facility] => Continuous monthly [Online] => $7.90 [Telephone] => $8.10 [TTY] => Youth/Senior15-15/65+ years [Email] => Regular 1 month pass ) [3] => Array ( [Category] => Single Admission [Admission Type] => $5.50 [Facility] => $7 [Facility Plus] => $7.25 [All Facility] => Child2-10 years [Online] => $408 [Telephone] => $520 [TTY] => $530 [Email] => Child2-10 years ) [4] => Array ( [Category] => Child2-10 years [Admission Type] => Continuous monthly [Facility] => $29 [Facility Plus] => $40 [All Facility] => $41 [Online] => Regular 1 Month Pass [Telephone] => $37 [TTY] => $46 [Email] => $48 ) [5] => Array ( [Category] => $31.50 [Admission Type] => Family [Facility] => Multi per visit (5+)* [Facility Plus] => $19.80 [All Facility] => $24.30 [Online] => Family [Telephone] => Single Admission [TTY] => $22 [Email] => $27 ) [6] => Array ( [Category] => $161 [Admission Type] => $188 [Facility] => Family [Facility Plus] => Annual [All Facility] => $1308 [Online] => $218 [Telephone] => Family [TTY] => Continuous monthly [Email] => $123 ) [7] => Array ( [Category] => $110 [Admission Type] => Adult18-64 years [Facility] => Multi per visit (5+)* [Facility Plus] => $75 [All Facility] => $925 [Online] => Adult18-64 years [Telephone] => Single Admission [TTY] => $111 [Email] => $115 ) [8] => Array ( [Category] => $610 [Admission Type] => $615 [Facility] => Adult18-64 years [Facility Plus] => Annual [All Facility] => $480 [Online] => $714 [Telephone] => Adult18-64 years [TTY] => Continuous monthly [Email] => $415 ) [9] => Array ( [Category] => $6.30 [Admission Type] => $7.90 [Facility] => $8.10 [Facility Plus] => Youth/Senior15-15/65+ years [All Facility] => Regular 1 month pass [Online] => $8.75 [Telephone] => $9 [TTY] => Youth/Senior15-15/65+ years [Email] => Multi per visit (5+)* ) [10] => Array ( [Category] => Annual [Admission Type] => $1414 [Facility] => $1414 [Facility Plus] => $141 [All Facility] => Child2-10 years [Online] => $40 [Telephone] => $50 [TTY] => $51 [Email] => Youth/Senior15-15/65+ years ) [11] => Array ( [Category] => Child2-10 years [Admission Type] => Regular 1 Month Pass [Facility] => $737 [Facility Plus] => $746 [All Facility] => $748 [Online] => Multi per visit (5+)* [Telephone] => $14 [TTY] => $14 [Email] => $14 ) [12] => Array ( [Category] => $6936 [Admission Type] => Family [Facility] => Single Admission [Facility Plus] => $785 [All Facility] => $875 [Online] => Child2-10 years [Telephone] => Annual [TTY] => $785 [Email] => $785 ) [13] => Array ( [Category] => $111 [Admission Type] => $222 [Facility] => Family [Facility Plus] => monthly [All Facility] => $000 [Online] => $2222 [Telephone] => Family [TTY] => Regular 1 month pass [Email] => $000 ) [14] => Array ( [Category] => [Admission Type] => [Facility] => [Facility Plus] => [All Facility] => [Online] => $111 [Telephone] => $222 [TTY] => [Email] => ) )
Array ( [0] => Array ( [Category] => Adult18-64 years [Admission Type] => Single Admission [Facility] => $111 [Facility Plus] => $115 [All Facility] => $110 ) [1] => Array ( [Category] => Adult18-64 years [Admission Type] => Multi per visit (5+)* [Facility] => $75 [Facility Plus] => $925 [All Facility] => $15 ) [2] => Array ( [Category] => Adult18-64 years [Admission Type] => Regular 1 month pass [Facility] => $551 [Facility Plus] => $710 [All Facility] => $714 ) [3] => Array ( [Category] => Adult18-64 years [Admission Type] => Continuous monthly [Facility] => $415 [Facility Plus] => $610 [All Facility] => $615 ) [4] => Array ( [Category] => Adult18-64 years [Admission Type] => Annual [Facility] => $480 [Facility Plus] => $624 [All Facility] => $686 ) [5] => Array ( [Category] => Youth/Senior15-15/65+ years [Admission Type] => Single Admission [Facility] => $7 [Facility Plus] => $8.75 [All Facility] => $9 ) [6] => Array ( [Category] => Youth/Senior15-15/65+ years [Admission Type] => Multi per visit (5+)* [Facility] => $6.30 [Facility Plus] => $7.90 [All Facility] => $8.10 ) [7] => Array ( [Category] => Youth/Senior15-15/65+ years [Admission Type] => Regular 1 month pass [Facility] => $46 [Facility Plus] => $59 [All Facility] => $61 ) [8] => Array ( [Category] => Youth/Senior15-15/65+ years [Admission Type] => Continuous monthly [Facility] => $40 [Facility Plus] => $50 [All Facility] => $51 ) [9] => Array ( [Category] => Youth/Senior15-15/65+ years [Admission Type] => Annual [Facility] => $1414 [Facility Plus] => $1414 [All Facility] => $141 ) [10] => Array ( [Category] => Child2-10 years [Admission Type] => Single Admission [Facility] => $44 [Facility Plus] => $44 [All Facility] => $777 ) [11] => Array ( [Category] => Child2-10 years [Admission Type] => Multi per visit (5+)* [Facility] => $14 [Facility Plus] => $14 [All Facility] => $14 ) [12] => Array ( [Category] => Child2-10 years [Admission Type] => Regular 1 Month Pass [Facility] => $737 [Facility Plus] => $746 [All Facility] => $748 ) [13] => Array ( [Category] => Child2-10 years [Admission Type] => Continuous monthly [Facility] => $544 [Facility Plus] => $450 [All Facility] => $471 ) [14] => Array ( [Category] => Child2-10 years [Admission Type] => Annual [Facility] => $785 [Facility Plus] => $785 [All Facility] => $6936 ) [15] => Array ( [Category] => Family [Admission Type] => Single Admission [Facility] => $785 [Facility Plus] => $875 [All Facility] => $52 ) [16] => Array ( [Category] => Family [Admission Type] => Multi per visit (5+)* [Facility] => $000 [Facility Plus] => $120 [All Facility] => $2222 ) [17] => Array ( [Category] => Family [Admission Type] => Regular 1 month pass [Facility] => $000 [Facility Plus] => $111 [All Facility] => $222 ) [18] => Array ( [Category] => Family [Admission Type] => monthly [Facility] => $000 [Facility Plus] => $111 [All Facility] => $222 ) [19] => Array ( [Category] => Family [Admission Type] => Annual [Facility] => $000 [Facility Plus] => $111 [All Facility] => $222 ) )
第二组结果只有当我在页面中有一个表格时才会得到它。
非常感谢!
解决方案
目前,您只是提取所有的<th>
and<td>
标记,而没有将其限制在任何表中。
因此,您可以改为在表单的第一个表中开始此搜索...
$table1 = $DOM->getElementsByTagName('table')[0];
$Header = $table1->getElementsByTagName('th');
$Detail = $table1->getElementsByTagName('td');
推荐阅读
- python - 如何从矩阵的所有列中减去相同的数组?
- hc-05 - 有没有办法告诉 azsphere cli 使用特定的 com 端口?
- swift - 在 AVPlayer 的主包中获取子文件夹路径的问题
- python - 设置 SparkContext 时出现 Py4JError
- sql - 用另一个表列中的值更新和替换一个表列中的值
- vba - MS Access:如何将查询中的数据加载到表单中
- azure - 如何在 Azure 上使用 terraform 部署应用服务
- python - 'bot.run' 期间 Discord selfbot 的 MemoryError
- django-templates - Jinja / Django for 循环范围不起作用
- javascript - setTimout 调用太多次