Разобрать таблицу с помощью PHP и Xpath - PullRequest
0 голосов
/ 04 августа 2020

Я бы хотел получить информацию из этой таблицы:

<table>
    <tbody>
        <tr>
            <th rowspan="1">Monday</th>
            <td colspan="3" class="closed">Closed</td>
        </tr>
        <tr class="sep"></tr>
        <tr>
            <th rowspan="3">Tuesday</th>
            <td>12:30 pm</td>
            <td class="sep">-</td>
            <td>2:00 pm</td>
        </tr>
        <tr>
            <td>7:30 pm</td>
            <td class="sep">-</td>
            <td>10:00 pm</td>
        </tr>
        <tr class="sep"></tr>
        <tr>
            <th rowspan="3">Wednesday</th>
            <td>12:30 pm</td>
            <td class="sep">-</td>
            <td>2:00 pm</td>
        </tr>
        <tr>
            <td>7:30 pm</td>
            <td class="sep">-</td>
            <td>10:00 pm</td>
        </tr>
        ...
        <tr class="sep"></tr>
    </tbody>
</table>

Я использую это, чтобы получить часы с PHP и Xpath:

$h = 0;
preg_match_all('/<table.*?>(.*?)<\/table>/is', $page, $hours);
$dom = new domDocument; 
$dom->loadHTML($hours[0][0]); 
$dom->preserveWhiteSpace = false; 
$tables = $dom->getElementsByTagName('table'); 
$rows = $tables->item(0)->getElementsByTagName('tr'); 

foreach ($rows as $row) {
    if($row->getAttribute('class') == 'sep') {}
    else {
        $cols = $row->getElementsByTagName('td'); 

        if($cols->item(0)->nodeValue == 'Closed') {
            $datas[$activity]['hours']['day'.$h] = 'Closed';
        }
        else {
            $datas[$activity]['hours']['day'.$h]['open'] = $cols->item(0)->nodeValue;
            $datas[$activity]['hours']['day'.$h]['close'] = $cols->item(2)->nodeValue;
        }
        $h++;
    }
}

Проблема для день, как вторник, у меня есть два набора часов (полдень и вечер). Мой код работает, но разделяет данные на две части.

Знаете почему?

Спасибо.

1 Ответ

0 голосов
/ 04 августа 2020

К сожалению, php не поддерживает xpath 2.0 и выше, поэтому нам приходится прибегать к хитрости, используя xpath 1.0. Вы можете начать с этого и изменить его в соответствии с вашими потребностями:

$days = $xp->query('//tr/th');

foreach ($days as $day) {
    $target = $day->textContent;
    echo $target . "\r\n";
    $exp = '//tr/th[./text()="' .$target . '"]//following-sibling::td[not(@class="sep")]';
    $exp2 = '//tr[th[./text()="' .$target . '"]]//following-sibling::tr[not(./th)][1]//td[not(@class="sep")]';
    $hours = $xp->query($exp);
    $hours2 = $xp->query($exp2);
    myFunction($hours);
    myFunction($hours2);

 echo "\r\n";
}

function myFunction($somethings){
    foreach($somethings as $something){
        $info = $something->textContent;
        echo $info . "\r\n";

    }
}

Вывод:

Monday
Closed 

Tuesday
12:30 pm 
2:00 pm 
7:30 pm 
10:00 pm 

Wednesday
12:30 pm 
2:00 pm 
7:30 pm 
10:00 pm 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...