#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
.