Goutte — Проверьте, есть ли два узла

#php #goutte

Вопрос:

Я использую php 7.4.1 и. "fabpot/goutte": "^3.3"

У меня есть следующий сценарий:

 <?php
require_once '../vendor/autoload.php';

use SymfonyComponentDomCrawlerCrawler;
use GoutteClient;

try {

        $resArr = array();
        $tempArr = array();

        $url = "https://edikte.justiz.gv.at/edikte/ex/exedi3.nsf/0/19dd135274ceb842c12586390028507e?OpenDocumentamp;f=1amp;bm=2";

        // get page
        $client = new Client();
        $content = $client->request('GET', $url)->html();
        $crawler = new Crawler($content, null, null);
        $table = $crawler->filter('#diveddoc > div:nth-child(2) > table')->first()->closest('table');

        $table->filter('tr')
            ->each(function (Crawler $tr) use (amp;$firm, amp;$resArr, amp;$tempArr) {

                $val = addScrappedTextToArr($tr, 'PLZ/Ort:');
                list($tempArr, $val) = checkNullAddArr($val, "plz_ort", $tempArr);

                $val = addScrappedTextToArr($tr, 'Objektgröße:');
                list($tempArr, $val) = checkNullAddArr($val, "objektGroesse", $tempArr);

            });

        array_push($resArr, $tempArr);

        var_dump($resArr);
} catch (Exception $e) {
    report($e);
}


function checkNullAddArr($val, $key, $tempArr)
{
    if (!is_null($val)) {
        $tempArr[$key] = $val;
        $val = null;
    }
    return array($tempArr, $val);
}

function addScrappedLinkToArr(Crawler $tr, $scrapVal)
{
    if (strpos($tr->text(), $scrapVal) !== false) {
        $val = "https://edikte.justiz.gv.at" . trim($tr->filter('td > a')->attr("href"));
        return $val;
    }
}

function addScrappedTextToArr(Crawler $tr, $scrapVal)
{
    /*
    if ($tr->filter('td')->count() >= 2) {
        $label = $tr->filter('td.tlabel')->text();
*/
    if (strpos($tr->text(), $scrapVal) !== false) {
        $val = trim(str_replace([$scrapVal], "", $tr->text()));
        return $val;
        // array_push($resArr, $val);
    }
    // }
    // return $arr;
}
 

Как вы можете видеть, вывод для ключа массива следующий objectGroesse :

введите описание изображения здесь

Однако я хотел бы получить желтый текст вместо красного подчеркнутого текста:

введите описание изображения здесь

Поскольку я просто пытаюсь сопоставить все строки, слово Objektgröße: найдено в более крупном тексте и сопоставлено.

Я попытался сделать следующее, просто переписав функцию addScrappedTextToArr() для фильтрации на этикетке:

 function addScrappedTextToArr(Crawler $tr, $scrapVal)
{

    if ($tr->filter('td')->count() >= 2) {
        $label = $tr->filter('td.tlabel')->text();

        if (strpos($tr->text(), $scrapVal) !== false) {
            $val = trim(str_replace([$scrapVal], "", $tr->text()));
            return $val;
            // array_push($resArr, $val);
        }
    }
    // return $arr;
}
 

Однако я получаю следующую ошибку:

The current node list is empty.

Есть какие-либо предложения, как исправить мою ошибку выше?

Я ценю ваши ответы!

Ответ №1:

Вы получаете ошибку, потому что, даже если ваше условие для извлечения метки работает для строк, подобных этой:

 <tr>
    <td class="tlabel">Grundbuch:</td>
    <td class="ttext">04018amp;nbsp;Leobersdorf</td>
</tr>
 

таблица также содержит эту строку:

 <tr>
    <td class="flabel">EZ:</td>
    <td class="ftext">2074</td>
</tr>
 

В вашем состоянии вы только проверяете, содержит ли строка по крайней мере две <td> ячейки, а затем предполагаете, что строка содержит ячейку с классом tlabel :

 if ($tr->filter('td')->count() >= 2) {
    $label = $tr->filter('td.tlabel')->text();
 

Это не удается для строки, упомянутой выше, так как она содержит <td> класс with flabel вместо tlabel .