以下两个函数可以很好地从网址获取元数据。首先,它获取网页的标题,然后搜索opengraph描述标记。如果它没有找到og:description,它将回溯到元描述。
我想要发生的事情是进一步回落所以如果不存在元描述,它将抓住前25个单词的文字。
同样我想在og:image上创建一个后退,所以如果不存在,它将获取它在页面上找到的第一个图像。
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);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
function getit($site)
{
$content = file_get_contents_curl($site);
$doc = new DOMDocument();
@$doc->loadHTML($content);
$nodes = $doc->getElementsByTagName('title');
$node = $doc->getElementsByTagName('img');
$title = $nodes->item(0)->nodeValue;
$firstimage = $node->item(0)->getAttribute('src');
$metas = $doc->getElementsByTagName('meta');
for ($i = 0; $i < $metas->length; $i++)
{
$meta = $metas->item($i);
if($meta->getAttribute('property') == 'og:description')
{
$description = $meta->getAttribute('content');
}
elseif ($meta->getAttribute('name') == 'description')
{
$description = $meta->getAttribute('content');
}
if($meta->getAttribute('property') == 'og:image')
{
$image = $meta->getAttribute('content');
}
}
$str .= 'Title: '.$title.' <br/><br/>';
$str .= 'Description: '.$description.' <br/><br/>';
$str .= 'Image: <img src="'.$image.'">';
$str .= 'Image2: <img src="'.$firstimage.'">';
echo $str;
}
我对使用curl非常陌生,并且根本不熟悉它,所以我真的不知道从哪里开始或结束修改我的代码来实现这一点。我已经将二进制传输选项添加到curl setopt中,因为我相信它需要一个二进制传输来获取图像,但是我真的对我在这里做什么一无所知,并且会对我如何做到这一点表示赞赏?
更新
我更新了上面的代码以删除二进制传输。我还补充了以下内容:
$node = $doc->getElementsByTagName('img');
$firstimage = $node->item(0)->getAttribute('src');
然后出于测试目的,我补充说:
$str .= 'Image2: <img src="'.$firstimage.'">';
所以我现在已经返回了最新的图像,仍然需要弄明白才能获得页面上前25个单词的文字。
答案 0 :(得分:0)
因此对于25个单词,我调用了第一个段落标记并将其值设置为字符串,然后我展开了字符串并调用了前25个单词。我将它们设置为一个变量,这样它们就可以通过测试轻松回应。
对于第一张图片,我补充道:
$node = $doc->getElementsByTagName('img');
$firstimage = $node->item(0)->getAttribute('src');
然后我做了一个测试,看看og:image是否为空,如果是,我会回显第一张图片。
<?
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);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
function getit($site) {
$parsing = file_get_contents_curl($site);
//parsing begins here:
$doc = new DOMDocument();
@$doc->loadHTML($parsing);
$nodes = $doc->getElementsByTagName('title');
$node = $doc->getElementsByTagName('img');
$para = $doc->getElementsByTagName('p');
//get and display what you need:
$title = $nodes->item(0)->nodeValue;
$firstimage = $node->item(0)->getAttribute('src');
$firstparagraph = $para->item(0)->nodeValue;
$metas = $doc->getElementsByTagName('meta');
for ($i = 0; $i < $metas->length; $i++)
{
$meta = $metas->item($i);
if($meta->getAttribute('property') == 'og:description') {
$description = $meta->getAttribute('content');
}
elseif ($meta->getAttribute('name') == 'description') {
$description = $meta->getAttribute('content');
} else {
$descrition = "<p>".implode(' ', array_slice(explode(' ', $firstparagraph), 0, 25))."</p>";
}
if($meta->getAttribute('property') == 'og:image') {
$image = $meta->getAttribute('content');
}
}
if ($image != '') { $image = $image; } else { $image = $firstimage; }
$str .= 'Title: '.$title.' <br/><br/>';
$str .= 'Description: '.$description.' <br/><br/>';
$str .= 'Image: <img src="'.$image.'"><br/><br/>';
echo $str;
}
?>