首页 > 解决方案 > 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&nbsp;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&nbsp;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+)*&nbsp;</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&nbsp;</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&nbsp;</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&nbsp;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+)*&nbsp;</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&nbsp;</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&nbsp;</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&nbsp;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&nbsp;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+)*&nbsp;</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&nbsp;</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&nbsp;&nbsp;</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&nbsp;</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 ) )

第二组结果只有当我在页面中有一个表格时才会得到它。

非常感谢!

标签: phphtml

解决方案


目前,您只是提取所有的<th>and<td>标记,而没有将其限制在任何表中。

因此,您可以改为在表单的第一个表中开始此搜索...

$table1 = $DOM->getElementsByTagName('table')[0];
$Header = $table1->getElementsByTagName('th');
$Detail = $table1->getElementsByTagName('td');

推荐阅读