0

我想知道是否有人可以对我遇到的问题有所了解。我正在构建一个 SEO 工具,用于查看网站标题和描述元标记。我所经历的是使用

<?php

$tags = get_meta_tags("https://twitter.com");
echo $tags['description'];
?>

我收到用德语返回的描述

"Verbinde Dich sofort mit den Dingen, die für Dich am wichtigsten sind. Folge Freunden, Experten, Lieblingsstars und aktuellen Nachrichten"

而不是英语

“立即连接到对您来说最重要的事情。关注您的朋友、专家、最喜欢的名人和突发新闻。”

我还发现 Bing.com 我也有这个问题。我也用 Curl 试过这个,得到了同样的结果。

这就是我的 curl 代码的样子,

<?

$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: "; // browsers keep this blank. 

function file_get_contents_curl($url)
{
$ch = curl_init();

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

$data = curl_exec($ch);
curl_close($ch);

return $data;
}

$html = file_get_contents_curl("https://twitter.com");

//parsing begins here:
$doc = new DOMDocument();
@$doc->loadHTML($html);
$nodes = $doc->getElementsByTagName('title');

//get and display what you need:
$title = $nodes->item(0)->nodeValue;

$metas = $doc->getElementsByTagName('meta');

for ($i = 0; $i < $metas->length; $i++)
{
$meta = $metas->item($i);
if($meta->getAttribute('name') == 'description')
    $description = $meta->getAttribute('content');
if($meta->getAttribute('name') == 'keywords')
    $keywords = $meta->getAttribute('content');
if($meta->getAttribute('language') == 'language');
    $language = $meta->getAttribute('language');
}

echo "Title: $title". '<br/><br/>';
echo "Description: $description". '<br/><br/>';
echo "Keywords: $keywords";

?>

curl 响应在这里运行 => http://www.chillwebdesigns.co.uk/tools/4/test.php

以前有人遇到过这个吗?

4

1 回答 1

4

发送的 HTTP 请求get_meta_tags不包含Accept-Language普通 Web 浏览器发送的传统标头,以通知服务器哪种语言可能合适。

似乎某些网站(例如 Twitter)将使用地理 IP 查找来确定内容语言:

从我在瑞典的本地计算机

Koppla direkt upp dig mot det som är viktigast för dig。Följ Dina vänner, 专家, favouritkändisar, och nyheter。

从我在英国伦敦的 VPS

立即连接到对您来说最重要的事情。关注您的朋友、专家、喜爱的名人和突发新闻。

因此,似乎如果您打算只查看英文元数据,则需要使您的脚本像英文本地化网络浏览器一样使用Accept-language,并且可能还使用其他方法。

编辑:这是一个如何通过首先使用 cURL 获取 HTML 来提取元标记的示例。有关将 cURL 标头设置为包含的Accept-Language详细信息。

代码示例

<?php
function file_get_contents_curl($url)
{
$ch = curl_init();

$header = array();
$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,"; 
$header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
$header[] = "Cache-Control: max-age=0"; 
$header[] = "Connection: keep-alive"; 
$header[] = "Keep-Alive: 300"; 
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; 
$header[] = "Accept-Language: en-us,en;q=0.5";

curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

$data = curl_exec($ch);
curl_close($ch);

return $data;
}

$html = file_get_contents_curl("http://twitter.com");

//parsing begins here:
$doc = new DOMDocument();
@$doc->loadHTML($html);
$nodes = $doc->getElementsByTagName('title');

//get and display what you need:
$title = $nodes->item(0)->nodeValue;

$metas = $doc->getElementsByTagName('meta');

for ($i = 0; $i < $metas->length; $i++)
{
$meta = $metas->item($i);
if($meta->getAttribute('name') == 'description')
    $description = $meta->getAttribute('content');
if($meta->getAttribute('name') == 'keywords')
    $keywords = $meta->getAttribute('content');
if($meta->getAttribute('language') == 'language');
    $language = $meta->getAttribute('language');
}

echo "Title: $title". '<br/><br/>';
echo "Description: $description". '<br/><br/>';
echo "Keywords: $keywords";

?>
于 2013-08-01T09:18:04.817 回答