PHP, извлекающий содержимое блока DIV с помощью документа - PullRequest
1 голос
/ 27 апреля 2019

Извлечь содержимое блока DIV.В блоке Div больше блоков.Я хочу получить некоторую информацию.Есть несколько блоков Div.Было бы лучше, если бы он мог работать в цикле foreach.

$dom_document = new DOMDocument();
libxml_use_internal_errors(true);
$dom_document->loadHTML($html);
libxml_clear_errors();
$dom_document->preserveWhiteSpace = false;

//use DOMXpath to navigate the html with the DOM
$xpath = new DOMXpath($dom_document);

$items = $xpath->query('//div[contains(@class,"card")]');
foreach ($items as $item) {

   $title = $xpath->xpath('.//div[@class="card-header"]/div/a[@class="text-number"]');

}

echo $title;

Der HTML-Code dazu:


        <div class="row">
          <div class="col-xl-4 col-lg-6 col-md-6 col-smr-2 my-12 col-xs-12 mt-2 mb-3">
                    <div class="card">
                      <div class="card-header">
                        <div class="d-flex mb-2"><a class="text-number" href="/read/3325" id="3325">NUMBER</a>
                          </div>
                        </div>
                        <div class="d-flex">
                          <h5><a class="mr-auto" href="LINK" target="_blank">TITLE</a>
                          </h5>
                        </div>
                        <div class="d-flex"> <strong class="mr-2">AUTOR</strong><span class="mr-2">RANDOM-NUMBER</span>
                          <time class="text-muted mr-2" datetime="2019-04-26T01:20:28.000Z">TIME</time>
                        </div>
                      </div>
                      <div class="card-body">
                        <div class="card-text">CONTENT</div>
                      </div>
                    </div>
          </div>
          <div class="col-xl-4 col-lg-6 col-md-6 col-smr-2 my-12 col-xs-12 mt-2 mb-3">
                    <div class="card">
                      <div class="card-header">
                        <div class="d-flex mb-2"><a class="text-number" href="/read/3325" id="3325">NUMBER</a>
                          </div>
                        </div>
                        <div class="d-flex">
                          <h5><a class="mr-auto" href="LINK" target="_blank">TITLE</a>
                          </h5>
                        </div>
                        <div class="d-flex"> <strong class="mr-2">AUTOR</strong><span class="mr-2">RANDOM-NUMBER</span>
                          <time class="text-muted mr-2" datetime="2019-04-26T01:20:28.000Z">TIME</time>
                        </div>
                      </div>
                      <div class="card-body">
                        <div class="card-text">CONTENT</div>
                      </div>
                    </div>
          </div>
          <div class="col-xl-4 col-lg-6 col-md-6 col-smr-2 my-12 col-xs-12 mt-2 mb-3">
                    <div class="card">
                      <div class="card-header">
                        <div class="d-flex mb-2"><a class="text-number" href="/read/3325" id="3325">NUMBER</a>
                          </div>
                        </div>
                        <div class="d-flex">
                          <h5><a class="mr-auto" href="LINK" target="_blank">TITLE</a>
                          </h5>
                        </div>
                        <div class="d-flex"> <strong class="mr-2">AUTOR</strong><span class="mr-2">RANDOM-NUMBER</span>
                          <time class="text-muted mr-2" datetime="2019-04-26T01:20:28.000Z">TIME</time>
                        </div>
                      </div>
                      <div class="card-body">
                        <div class="card-text">CONTENT</div>
                      </div>
                    </div>
          </div>
          </div>

Мне нужна следующая информация - NUMBER - LINK - TITLE - AUTOR- СЛУЧАЙНЫЙ НОМЕР - ВРЕМЯ - СОДЕРЖАНИЕ

Я очень благодарен за вашу помощь.Если бы кто-то знал об этом, было бы здорово.

1 Ответ

1 голос
/ 27 апреля 2019

Это тот случай, когда нужно выбрать отдельные элементы из XML, начиная с каждого полученного $item.

Используя DOMDocument, проще придерживаться выражений XPath, но с помощью descendant::убедитесь, что искомые узлы находятся в начальном элементе, который указан в качестве третьего параметра для evaluate().В качестве каждой точки вам нужно строковое значение - я использовал evaluate('string(...)), так как это вернет строку, тогда как query() вернет DOMNodeList, который вам затем нужно будет обработать.

Я надеюсь, что XPath имеет смыслУчитывая вышесказанное, единственной странностью является СОДЕРЖАНИЕПоскольку это следующий узел (а не дочерний узел), я использую following-sibling:: для доступа к нему.

$items = $xpath->query('//div[@class="card"]');
foreach ($items as $item) {
    $title = $xpath->evaluate('string(descendant::*//a[@class="text-number"])', $item);
    $link = $xpath->evaluate('string(descendant::div[@class="d-flex"][1]/h5/a/@href)', $item);
    $title = $xpath->evaluate('string(descendant::div[@class="d-flex"][1]/h5/a)', $item);
    $autor = $xpath->evaluate('string(descendant::div[@class="d-flex"][2]/strong)', $item);
    $randomNumber = $xpath->evaluate('string(descendant::div[@class="d-flex"][2]/span)', $item);
    $time = $xpath->evaluate('string(descendant::div[@class="d-flex"][2]/time)', $item);
    $content = $xpath->evaluate('string(following-sibling::*//div[@class="card-text"])', $item);

    echo $title."/".$link."/".$title."/".$autor."/".$randomNumber.
        "/".$time."/".$content.PHP_EOL;
}

Для получения дополнительной информации о таких вещах, как descendant:: и following-sibling::, они являются осями XPath, которыео здесь .

...