получить метатег тег с xpath - PullRequest
12 голосов
/ 25 мая 2010

Мне нужно содержание описания и ключевые слова тега содержимого. У меня есть этот код, но ничего не пишу. Идея

$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;
}

Ответы [ 5 ]

28 голосов
/ 25 мая 2010

Вы можете ссылаться на атрибуты, используя @, за которым следует имя атрибута (см. Ниже), и вы можете напрямую запросить атрибуты;Ваш запрос 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 голосов
/ 25 мая 2010

У вас две проблемы. Во-первых, имя является атрибутом, поэтому вам нужно добавить @,

$nodes = $xpath->query('/html/head/meta[@name="description"]');

Во-вторых, все узлы пусты, поэтому печатать нечего.

Чтобы напечатать значение атрибута, сделайте это,

foreach($nodes as $node){
  $attr = $node->getAttribute('content');
  print $attr;
}
1 голос
/ 16 августа 2016

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

Другими словами, если вы ищете мета name = "description" ... или "meta name =" Keywords ", он не найдет" meta name = "Description" ... или "meta name =" Keywords "... соответственно. Так осторожно с этим!

И я могу сказать вам, что, поработав некоторое время с xdom и metatags, в конце концов, я считаю, что для этого лучше всего использовать эту функцию: http://php.net/manual/es/function.get-meta-tags.php

1 голос
/ 12 июня 2014

Вместо включения части / html / head вы также можете использовать двойную косую черту, что означает, что следующий узел может находиться в любом месте кода:

//meta[@name='description']

даст тот же результат, что и:

/html/head/meta[@name='description']

Не имеет большого значения, но меньше печатает ...

0 голосов
/ 25 мая 2010

Убедитесь, что вы поставили EOD; в строке без пробелов и отступов, как:

  $str = <<< EOD
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

EOD;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...