php xquery разбор html

#php #html #xquery

#php #HTML #xquery

Вопрос:

как анализировать вложенные html-теги, подобные этой структуре:

 lt;article class="tile"gt; lt;div class="tile-content"gt;  lt;a href=link-1"gt;ignorelt;/agt;  lt;div class="tile-content__text tile-content__text--arrow-white"gt;  lt;label class="label-date label-date--blue"gt;01.12.2021lt;/labelgt;   lt;h4gt;lt;a class="link-color-black" href="link-1"gt;title-1lt;/agt;lt;/h4gt;  lt;p class="tile-content__paragraph tile-content__paragraph--gray pd-ver-10"gt;​  content-1  lt;/pgt;  lt;/divgt;  lt;a href="link-1" class="btn btn-link btn-link__more btn-link--arrow-right float-right"gt;morelt;/agt; lt;/divgt;  
 lt;article class="tile"gt;  lt;div class="tile-content"gt;  lt;a href=link-1"gt;ignorelt;/agt;  lt;div class="tile-content__text tile-content__text--arrow-white"gt;  lt;label class="label-date label-date--blue"gt;02.12.2021lt;/labelgt;   lt;h4gt;lt;a class="link-color-black" href="link-2"gt;title-2lt;/agt;lt;/h4gt;  lt;p class="tile-content__paragraph tile-content__paragraph--gray pd-ver-10"gt;​  content-2  lt;/pgt;  lt;/divgt;  lt;a href="link-2" class="btn btn-link btn-link__more btn-link--arrow-right float-right"gt;morelt;/agt;  lt;/divgt; lt;/articlegt;  

для массива, подобного:

 $parsedArray = [  0 =gt;   ['title =gt; 'title',  'link' =gt; 'link-1',  'date' =gt; '2021-12-01',  'content' =gt; 'content-1']  1 =gt;   ['title =gt; 'title-2',  'link' =gt; 'link-2',  'date' =gt; '2021-12-02',  'content' =gt; 'content-2'] ,....]  

я использую xquery, как описано выше, но это удаляет все теги, после этого у меня есть только текст из всех тегов, мне нужно извлечь информацию из всех тегов, какой-нибудь совет?

 $dom = new DOMDocument();  $dom-gt;loadHTML($html['html']);  $xpath = new DOMXPath($dom);   $nodelist = $xpath-gt;query("//article[contains(@class, 'tile')]");   foreach ($nodelist as $n) {  echo 'lt;pregt;';  var_dump($n);  echo 'lt;/pregt;';  

}

Ответ №1:

var_dump не будет анализировать DOM 🙂

Вам просто нужно повторно запросить ваши элементы внутри tile , а затем назначить их массиву.

Назначьте массив рабочих элементов для определения структуры, если это имеет значение, в противном случае просто создавайте результат по ходу работы.

 lt;?php $str = 'lt;article class="tile"gt;  lt;div class="tile-content"gt;  lt;a href=link-1"gt;ignorelt;/agt;  lt;div class="tile-content__text tile-content__text--arrow-white"gt;  lt;label class="label-date label-date--blue"gt;02.12.2021lt;/labelgt;   lt;h4gt;lt;a class="link-color-black" href="link-2"gt;title-2lt;/agt;lt;/h4gt;  lt;p class="tile-content__paragraph tile-content__paragraph--gray pd-ver-10"gt;  content-2  lt;/pgt;  lt;/divgt;  lt;a href="link-2" class="btn btn-link btn-link__more btn-link--arrow-right float-right"gt;morelt;/agt;  lt;/divgt; lt;/articlegt;';  $dom = new DOMDocument(); libxml_use_internal_errors(true); $dom-gt;loadHtml($str); libxml_clear_errors();  $xpath = new DOMXPath($dom);  $result = []; foreach ($xpath-gt;query("//article[contains(@class, 'tile')]") as $tile) {  // define item structure  $item = [  'title' =gt; '',  'link' =gt; '',  'date' =gt; '',  'content' =gt; ''  ];    // find date  $query = $xpath-gt;query("//label[contains(@class, 'label-date')][1]", $tile);  if (count($query)) {  $item['date'] = $query[0]-gt;nodeValue;  }   // find link/title  $query = $xpath-gt;query("//h4/a[1]", $tile);  if (count($query)) {  $item['link'] = $query[0]-gt;getAttribute('href');  $item['title'] = $query[0]-gt;nodeValue;  }    // find content  $query = $xpath-gt;query("//p[contains(@class, 'tile-content__paragraph')][1]", $tile);  if (count($query)) {  $item['content'] = $query[0]-gt;nodeValue;  }    // assign  $result[] = $item;    // cleanup  unset($item, $query); }  print_r($result);  

Выход:

 Array (  [0] =gt; Array  (  [title] =gt; title-2  [link] =gt; link-2  [date] =gt; 02.12.2021  [content] =gt;   content-2    )  )