Получить метатег описания с помощью 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;