0

我正在尝试从提供的 url 中提取各种数据,包括使用以下内容的描述元信息:-

$tags = get_meta_tags($_POST['url']);
echo $tags['description'];

这适用于某些网站,但不是全部。例如,如果我尝试http://twitter.com,我什么也得不到,但谷歌搜索(或在 facebook 中输入 url)会显示以下文本:-

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

推特页面的源代码中不存在此文本 - 这是从哪里来的,我将如何获得它?同样,我的代码也没有为http://bbc.com返回任何内容。

4

2 回答 2

1

对不起,但你的问题的前提是错误的:

推特页面的源代码中不存在此文本

是的,它确实:

<meta name="description" content="Instantly connect to what&#39;s most important to you. Follow your friends, experts, favorite celebrities, and breaking news.">`

——推特网

并且var_dump(get_meta_tags("http://twitter.com"));

array(4) {
  ["description"]=>
  string(125) "Instantly connect to what&#39;s most important to you. Follow your friends, experts, favorite celebrities, and breaking news."
  ["msapplication-tileimage"]=>
  string(42) "//abs.twimg.com/favicons/win8-tile-144.png"
  ["msapplication-tilecolor"]=>
  string(7) "#00aced"
  ["swift-page-name"]=>
  string(5) "front"
}
于 2013-05-22T21:00:51.067 回答
1

我认为您的托管服务器的 IP 不在任何 GeoIP 数据库中。

我只是将这段代码拼凑在一起:

function get_meta_tags_from_path($path)
{
    $tags = array();
    $source = file_get_contents($path);
    $count = preg_match_all(
        "|<meta[^>]+name=\"([^\"]*)\"[^>]" . "+content=\"([^\"]*)|i",
        $source, $matches, PREG_PATTERN_ORDER);
    for($i = 0; $i < $count; $i++)
        $tags[$matches[1][$i]] = $matches[2][$i];
    return $tags;
}

$tags = get_meta_tags_from_path('https://twitter.com/'));
$description = $tags['description'];

它工作正常,如此处所示但是,您还可以看到它显示了荷兰元描述,因为服务器位于荷兰,在已知的荷兰 IP 上。如果 Twitter 无法通过标签或 GeoIP 确定访问者的可能区域,那么 Twitter 很可能Accept-language不会尝试提供本地化内容。除非您使用 cURL 来发起一个请求,其中Accept包含正确的标头来模拟实际的浏览器,否则您在主机上的运气相当差。

于 2013-05-22T22:01:19.760 回答