Получить метатег описания с помощью xpath
Мне нужно содержание описания и содержимого тегов ключевых слов. У меня есть этот код, но ничего не пишите. Идея?
$str = <<< EOD
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta name="description" content="text in the description tag" />
<meta name="keywords" content="text, in, the, keywords, tag" />
</head>
EOD;
$dom = new DOMDocument();
$dom->loadHTML($str);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('/html/head/meta[name="description"]');
foreach($nodes as $node){
print $node->nodeValue;
}
Ответы
Ответ 1
Вы можете ссылаться на атрибуты с помощью @
, за которым следует имя атрибута (см. ниже), и вы можете напрямую запрашивать атрибуты; ваш запрос XPath был почти там.
// Look for the content attribute of description meta tags
$contents = $xpath->query('/html/head/meta[@name="description"]/@content');
// If nothing matches the query
if ($contents->length == 0) {
echo "No description meta tag :(";
// Found one or more descriptions, loop over them
} else {
foreach ($contents as $content) {
echo $content->value . PHP_EOL;
}
}
Ответ 2
У вас две проблемы. Во-первых, имя является атрибутом, поэтому вам нужно добавить @,
$nodes = $xpath->query('/html/head/meta[@name="description"]');
Во-вторых, все узлы пусты, поэтому печатать нечего.
Чтобы напечатать значение атрибута, сделайте это,
foreach($nodes as $node){
$attr = $node->getAttribute('content');
print $attr;
}
Ответ 3
Вместо того, чтобы включать /html/head часть, вы также можете использовать двойную косую черту, что означает, что следующий node может быть где угодно в коде:
//meta[@name='description']
Дает тот же результат, что и:
/html/head/meta[@name='description']
Не имеет большого значения, но это меньше набирает текст.
Ответ 4
И последнее, но не менее важное: извините за ожидание этого потока, запросы чувствительны к регистру.
Другими словами, если вы ищете мета name= "description"... или "meta name=", то он не найдет "meta name=" Описание "... или" meta name= "Ключевые слова"... соответственно. Будьте осторожны с этим!
И я могу сказать вам, что после работы с xdom и метатегами, в конечном итоге, я считаю, что наилучшим подходом для этого является использование этой функции: http://php.net/manual/es/function.get-meta-tags.php
Ответ 5
Убедитесь, что вы помещаете EOD;
в строку без пробелов и отступов, например:
$str = <<< EOD
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
EOD;