Невозможно получить только второй список на странице с PHP Simple DOM - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть этот код, чтобы попытаться извлечь список на странице:

$websiteURL = "https://waset.org/conferences-in-january-2022-in-tokyo";
$html = file_get_html($websiteURL);

foreach ( $html->find( 'ul') as $ul ) {
     foreach($ul->find('li') as $li) {
        echo "LI: " . $li . "<br>";
    }
}

Это делает то, что я от него ожидаю (то есть отображается каждые <li> для ВСЕХ <ul> вкл. страницы.

Однако, если я заменю второй foreach на (как я только хочу получить первый список):

foreach ( $html->find( 'ul', 1) as $ul ) {

Я получу:

"Вызов функции-члена find () для int"

..., который предполагает, что find('ul', 1) ничего не возвращал, но я не знаю почему?

Примечание: на этой странице более двух списков.

Кто-нибудь знает, что я делаю неправильно?

1 Ответ

1 голос
/ 16 февраля 2020

Чтобы ответить на ваш вопрос «Полагаю, мой вопрос в нижней строке - как мне получить доступ ко всем <li> со второго на веб-странице?» используя относительно современный API, хорошо поддерживаемый и встроенный в PHP:

<?php
$url = "https://waset.org/conferences-in-january-2022-in-tokyo";

libxml_use_internal_errors(true);
$dom = new DomDocument();
$dom->loadHtmlFile($url);
$lists = $dom->getElementsByTagName("ul");
$items = $lists[1]->getElementsByTagName("li");
foreach ($items as $item) {
    // clean up extra whitespace
    $text = preg_replace("/\s+/", " ", trim($item->textContent));
    echo "$text\n------\n";
}

Вывод:

ICA 2022: Aeroponics Conference, Tokyo (Jan 07-08, 2022)
------
ICAA 2022: Agroforestry and Applications Conference, Tokyo (Jan 07-08, 2022)
------
ICAAAA 2022: Applied Aerodynamics, Aeronautics and Astronautics Conference, Tokyo (Jan 07-08, 2022)
------
ICAAAE 2022: Aquatic Animals and Aquaculture Engineering Conference, Tokyo (Jan 07-08, 2022)
------
ICAAC 2022: Advances in Astronomical Computing Conference, Tokyo (Jan 07-08, 2022)
------
...

Также стоит отметить, что название конференции находится в * Элемент 1008 *, местоположение находится внутри <span>, и дата следует за ним. Используя это, вы можете довольно просто извлечь данные:

function getNodeText(\DomNode $node): string
{
    $return = "";
    foreach($node->childNodes as $child) {
        if ($child->nodeName === "#text") {
            $return .= trim($child->nodeValue);
        }
    }
    return $return;
}

foreach ($items as $item) {
    $conference = getNodeText($item->getElementsByTagName("a")[0]);
    $location = getNodeText($item->getElementsByTagName("span")[0]);
    $date = getNodeText($item);
    echo "------\n$conference | $location | $date\n";
}

Вывод:

------
ICA 2022: Aeroponics Conference, | Tokyo | (Jan 07-08, 2022)
------
ICAA 2022: Agroforestry and Applications Conference, | Tokyo | (Jan 07-08, 2022)
------
ICAAAA 2022: Applied Aerodynamics, Aeronautics and Astronautics Conference, | Tokyo | (Jan 07-08, 2022)
------
ICAAAE 2022: Aquatic Animals and Aquaculture Engineering Conference, | Tokyo | (Jan 07-08, 2022)
------
ICAAC 2022: Advances in Astronomical Computing Conference, | Tokyo | (Jan 07-08, 2022)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...