Извлечь содержимое определенного div, сохраняя только определенные элементы

Мне нужно извлечь только текстовую часть веб-страницы, сохраняя все и только <p> <h2>, <h3>, <h4> and <blockquote>s,

Теперь, используя DOMXPath и $div = $xpath->query('//div[@class="story-inner"]'); содержит много нежелательных элементов страницы, таких как картинки, рекламные блоки, другие пользовательские пометки и т. д. внутри текстового элемента div.

С другой стороны, используя следующий код:

$items = $doc->getElementsByTagName('<p>');
for ($i = 0; $i < $items->length; $i++) {
echo $items->item($i)->nodeValue . "<p>";
}

дает очень хороший и чистый результат очень близко к тому, что я хотел, но с <h2>, <h3>, <h4> and <blockquotes> отсутствует.

Интересно, есть ли какой-либо DOM-способ (1), указывающий только желаемые элементы страницы и извлекающий чистый результат, или (2) эффективный способ очистки результата, полученного с помощью $div = $xpath->query('//div[@class="story-inner"]');?

1

Решение

Вы могли бы использовать OR в вашем запросе xpath в этом случае. Просто каскадируйте эти теги, чтобы получить только нужные.

$url = "http://www.example.com/russian/international/2015/02/150218_ukraine_debaltseve_fighting";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$html = curl_exec($curl);
curl_close($curl);

$doc = new DOMDocument();
$html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8");
@$doc->loadHTML($html);

$xpath = new DOMXPath($doc);

$tags = array('p', 'h2');
$children_needed = implode(' or ', array_map(function($tag){ return sprintf('name()="%s"', $tag); }, $tags));
$query = "//div[@class='story-body__inner']//*[$children_needed]";
$div_children = $xpath->query($query);
if($div_children->length > 0) {
foreach($div_children as $child) {
echo $doc->saveHTML($child);
}
}
0

Другие решения

Если я правильно понял ваш вопрос .. это то, что вы просите …

$output1=preg_match('/^.*<tagName>(.*)<\/tagName>/', $value,$match1);

Сопоставьте с тэгами и получите данные между ними, используя preg_match

0

По вопросам рекламы [email protected]