Soru Link üzerinden web sitesi başlığı al


Nasıl olduğunu fark et Google Haberleri Her makalenin alt kısmındaki kaynaklar alıntılanmıştır.

Guardian - ABC Haberleri - Reuters -   Bloomberg

Bunu taklit etmeye çalışıyorum.

Örneğin, URL'yi gönderdikten sonra http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/ Ben dönmek istiyorum The Washington Times

Bu nasıl php ile mümkün olur?


33
2017-12-03 19:00


Menşei


Google haberleri, muhtemelen bilinen alanlar için bir arama tablosu yönetir ve belki de bilinmeyenler için HTML'yi analiz eder. Bir arama tablosu uygulamak için önemsiz olmalı, bu yüzden ikincisini yapan bir cevap verdim. - Matthew
İyi bir nokta çiziyorsun. - Noob


Cevaplar:


Cevabım, @AI W'nin sayfanın başlığını kullanmasının cevabı üzerinde genişliyor. Aşağıda söylediklerini gerçekleştirmek için kod.

<?php

function get_title($url){
  $str = file_get_contents($url);
  if(strlen($str)>0){
    $str = trim(preg_replace('/\s+/', ' ', $str)); // supports line breaks inside <title>
    preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title); // ignore case
    return $title[1];
  }
}
//Example:
echo get_title("http://www.washingtontimes.com/");

?>

ÇIKTI

Washington Times - Politika, Breaking   Haberler, ABD ve Dünya Haberleri

Gördüğünüz gibi, Google’ın tam olarak kullandığı tam olarak değil, bu yüzden bir URL’nin ana makine adını aldıklarına ve kendi listelerine uygun olduklarına inanmamı sağlıyor.

http://www.washingtontimes.com/ => Washington Times


54
2017-12-03 19:20



Teşekkürler, kod çalışıyor ama bağlantıyı söylese eğer aynı ana başlığı nasıl alırsın? washingtontimes.com/news/2010/dec/3/... ? Bence AI W'nin önerdiği şey bu. - Noob
Hostname almak ve kullanmak için parse_url getTitle($host); yerine. - TecBrat
regex ile html ayrıştırmadan başka bir yol? - Wissem
Regex eşleşmesi şöyle olmalı: preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title);  Bazı sitelerde tüm başlıklarda <başlık> bulunur, bu nedenle kontrol durumu görmezden gelmelidir. - OldDrunkenSailor
Bazı web sitelerinin birden fazla <title> etiketi kullanması nedeniyle açgözlü olmamaya özen gösterin: preg_match ("/ \ title {> (. *?) \ <\ / Title> - R.G.


$doc = new DOMDocument();
@$doc->loadHTMLFile('http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/');
$xpath = new DOMXPath($doc);
echo $xpath->query('//title')->item(0)->nodeValue."\n";

Çıktı:

Borç komisyonu test oylamasında kısa düştü - Washington Times

Açıkçası, temel hata işlemlerini de uygulamanız gerekir.


29
2017-12-03 19:15



DOMDOcument'i kullanmak için +1. - Pekka 웃
@Matthew URL'yi değiştirdiğimde facebook.com "Tarayıcınızı güncelleyin | Facebook" gösteriliyor. Bunun için herhangi bir çözüm var mı? - Enve
@Enve, ona bakmadan, sayfayı oluşturmak için çok sayıda Javascript kullandıklarını varsayıyorum. "Tarayıcınızı Güncelleyin" muhtemelen varsayılan başlıktır. Yani muhtemelen herhangi bir basit çözüm açısından şanstan yoksun. - Matthew
Matthew, bu harika! teşekkür ederim - IberoMedia


URL'nin içeriğini getirebilir ve içeriğin içeriği için düzenli bir ifade araması yapabilirsiniz. title öğesi.

<?php
$urlContents = file_get_contents("http://example.com/");
preg_match("/<title>(.*)<\/title>/i", $urlContents, $matches);

print($matches[1] . "\n"); // "Example Web Page"
?>

Ya da, normal bir ifade kullanmak istemiyorsanız (belgenin en üstüne yakın bir şeyle eşleştirmek için) DOMDocument nesnesi:

<?php
$urlContents = file_get_contents("http://example.com/");

$dom = new DOMDocument();
@$dom->loadHTML($urlContents);

$title = $dom->getElementsByTagName('title');

print($title->item(0)->nodeValue . "\n"); // "Example Web Page"
?>

Hangi yöntemi en çok beğendiğinize karar vermek için size bırakıyorum.


6
2017-12-03 19:03



Aaargh! Regexp ... ... veri ... almak ... için ... HTML - thejh
@thejh: Genelde orada ne tür HTML sayfalarının olduğunu bilmiyorsunuz. Ben DOMDocument regexp daha büyük bellek ayak izi olabilir sanırım. (PHP bellek sınırını aşabilirsiniz.) Bu, bir regex veya basit bir strpos işlevi kullanmak için haklı olduğu durumdur. - Martin Vseticka


Alan ana sayfasından get_meta_tags () öğesini kullanarak NYT, kırpmaya ihtiyaç duyabilecek ancak yararlı olabilecek bir şey getiriyor.

$b = "http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/" ;

$url = parse_url( $b ) ;

$tags = get_meta_tags( $url['scheme'].'://'.$url['host'] );
var_dump( $tags );

"Washington Times, ulusumuzun geleceğini etkileyen konularda son dakika haberleri ve yorumları sunar."


5
2017-12-03 20:30



Vay bu çok döndürür. Teşekkürler, harika kod! :) - Noob


CURL üzerinde PHP kılavuzu

<?php

$ch = curl_init("http://www.example.com/");
$fp = fopen("example_homepage.txt", "w");

curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
curl_close($ch);
fclose($fp);
?>

Perl regex eşleştirmesinde PHP kılavuzu

<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>

Ve bu ikisini bir araya getirmek:

<?php 
// create curl resource 
$ch = curl_init(); 

// set url 
curl_setopt($ch, CURLOPT_URL, "example.com"); 

//return the transfer as a string 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// $output contains the output string 
$output = curl_exec($ch); 

$pattern = '/[<]title[>]([^<]*)[<][\/]titl/i';

preg_match($pattern, $output, $matches);

print_r($matches);

// close curl resource to free up system resources 
curl_close($ch);      
?>

Bu örnekte PHP'nin bulunmamasından dolayı çalışacağına söz veremem ama başlamanıza yardımcı olmalısınız.


4
2017-12-03 19:03



A) Kıvırmak çok fazladır. B) HTML / XML'yi ayrıştırmak için normal ifadeleri kullanmak genellikle XPath sorgularını veya DOM'ı kullanmaktan daha az güvenilirdir. - Matthew
Bir belgeyi kesinlikle geçmek için. Ancak bir başlık etiketinin çıkarılması kolaydır. Başka bir endişe XPath XML içindir. Bir web sayfasının iyi oluşturulduğunu varsayalım XML bir inanç sıçramasıdır, imho. Sadece DOMXPath'ı bir kez kullandım ve bir web sayfasının tipik bir tren kazasıyla ne kadar iyi uğraştığından emin değilim. - Novikov
DOMDocument::loadHTML Özellikle tek bir etiket bulmak için HTML'ye XML'i dönüştürme konusunda yeterli bir iş yapacak. Bir başlık etiketi kadar basit bir şey bulmak için regexp kullanma, düşündüğünüz kadar önemsiz değildir. Örneğin, sizinki ile başarısız olur <title > boşluk nedeniyle. (XPath başarısız olursa, her zaman bir regexp'e geri dönebilirsiniz.) - Matthew
Evet bu doğru. '/[<][ ]*title[ ]*[>]([^<]*)/i' Kırılacak olan her şey, bir web tarayıcısında kullanılmak üzere tasarlanmamış olan herhangi bir DOM ayrıştırıcısını büyük olasılıkla kesecektir. - Novikov
Hmm .. CURL mükemmel çalışıyorken, bir başlık almak için daha basit bir şey kullanabileceğimi kabul ediyorum. Bununla birlikte, web sayfası hatalarından da kaçınmak istiyorum. İkilem içinde yaşıyorum .. - Noob


Bunun için üçüncü taraf bir hizmet kullanmaya istekliyseniz, yeni bir tane oluşturdum. www.runway7.net/radar

Başlık, açıklama ve daha fazlasını verir. Örneğin, deneyin Radar'daki örneğiniz. (http://radar.runway7.net/?url=http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/)


2
2018-01-21 05:15





Alternatif olarak kullanabilirsiniz Basit Html Dom Ayrıştırıcı:

<?php
require_once('simple_html_dom.php');

$html = file_get_html('http://www.washingtontimes.com/news/2010/dec/3/debt-panel-fails-test-vote/');

echo $html->find('title', 0)->innertext . "<br>\n";

echo $html->find('div[class=entry-content]', 0)->innertext;

1
2017-12-03 19:25



Hmm HTML dom Parser'ı hiç denemedim. Kesinlikle daha basit görünüyor. Diğer yöntemlere göre daha uzun sürmesi gerekip gerekmediğinden emin değilim. - Noob
@Noob DOMDocument'den çok daha yavaştır (bkz. İşte), ancak bu sayfada herhangi bir PHP uyarısı olmadan çalışır (ama ben tavsiye ederim konforce çözümü bazı hata işleme ile). - István Ujj-Mészáros
@ IstvánUjj-Mészáros kullanarak PHP uyarılarını devre dışı bırakabilirsiniz LIBXML_NOWARNING | LIBXML_NOERROR seçenekler. - Prodiger
Örnek: @$doc->loadHTMLFile($link, LIBXML_NOWARNING | LIBXML_NOERROR); - Prodiger