Avatar billede cht22 Professor
26. juli 2017 - 08:57 Der er 14 kommentarer og
2 løsninger

Hente meta title, description og keywords fra url

Er der en der har koden til at hente meta data fra en side?

Jeg kan godt hente siden med følgende kode og har forsøgt at søge på nettet efter noget kode der kan hente meta, men kunne ikke lige få det preg_match til at virke:

  $strhttp = @file_get_contents($url);
Avatar billede jakobdo Ekspert
26. juli 2017 - 09:00 #1
Hvad med at kigge på sådan et lib her: http://simplehtmldom.sourceforge.net/
Avatar billede cht22 Professor
26. juli 2017 - 09:11 #3
Når jeg prøver #1 får jeg bare denne fejlmeddelelse:

Fatal error: Call to a member function find() on string in C:\xampp\htdocs\get_title.php on line 7
Avatar billede michael_stim Ekspert
26. juli 2017 - 09:19 #4
Har du downloadet biblioteket?
Avatar billede cht22 Professor
26. juli 2017 - 09:22 #5
#4 Nej hvordan gør jeg det?
Avatar billede michael_stim Ekspert
26. juli 2017 - 09:24 #6
Under afsnittet Download & Documents:

Download & Documents
Download latest version form Sourceforge.
Read Online Document.
Avatar billede cht22 Professor
26. juli 2017 - 09:34 #7
Nå på den måde. Det var da godt nok omfattende bare for at hente 3 linjer fra noget html kode. Men jeg ser på det senere i dag. Tak
Avatar billede jakobdo Ekspert
26. juli 2017 - 09:46 #8
Det er ikke omfattende. :)
Du kan jo se hvor "nemt" det er at gøre med preg_match()
Avatar billede cht22 Professor
26. juli 2017 - 10:15 #9
Tak jeg fandt noget der virkede her:
https://gist.github.com/jeremiahlee/785766
Avatar billede michael_stim Ekspert
26. juli 2017 - 10:34 #10
Avatar billede jakobdo Ekspert
26. juli 2017 - 12:08 #11
Jeg tror dog det andet "lib" vil gøre dig godt fremad, da det dækker bredt.
Men hvis du "kun" skal bruge meta data her og nu, så kan din løsning være fin ja.
Avatar billede cht22 Professor
26. juli 2017 - 14:42 #12
Det bliver dog ikke hentet helt rigtigt fra f.eks.: http://netflix.com

Description:
width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0


Keywords:
Watch Netflix movies & TV shows online or stream right to your smart TV, game console, PC, Mac, mobile, tablet and more. Start your free trial today.


De skriver al deres html på en linje ved ikke om det er derfor, men ellers kan jeg ikke lige se hvorfor keywords bliver bytte ud med description og ved description bliver der hentet noget helt andet.
Avatar billede cht22 Professor
28. juli 2017 - 19:26 #13
Så lavede jeg lige en lappeløsgning, så det også virker på netflix.com og de øvrige sider jeg har prøvet indtil videre:

function not_finished_parseDescription($html) {
  $strhttp = $html;
  if ($strhttp != "") {
  $strpos = strpos(strtolower($strhttp),"<head>");
  if ($strpos !== FALSE) {
  $strhttp = substr($strhttp,$strpos+strlen("<head>"));
  $strpos = strpos(strtolower($strhttp),"</head>");
  if ($strpos !== FALSE) {
  $strhttp = substr($strhttp,0,$strpos);
  }}}
  if ($strhttp != "") {
      $strpos = strpos(strtolower($strhttp),"name=description");
      $strpos2 = strpos(strtolower($strhttp),"name=\"description\"");
      if ($strpos !== FALSE) {
        $strpos_end = strpos(strtolower($strhttp),">",$strpos);
        $strhttp = substr($strhttp,0,$strpos_end+1);
        $strpos_start = strrpos(strtolower($strhttp),"<");
        $strhttp = substr($strhttp,$strpos_start);
      }
      else if ($strpos2 !== FALSE) {
        $strpos_end = strpos(strtolower($strhttp),">",$strpos2);
        $strhttp = substr($strhttp,0,$strpos_end+1);
        $strpos_start = strrpos(strtolower($strhttp),"<");
        $strhttp = substr($strhttp,$strpos_start);
      }
  }

  return parseDescription($strhttp);
}

function parseDescription($html) {
    // Get the 'content' attribute value in a <meta name="description" ... />
    $matches = array();
    // Search for <meta name="description" content="Buy my stuff" />
    preg_match('/<meta.*?name=("|\')description("|\').*?content=("|\')(.*?)("|\')/i', $html, $matches);
    if (count($matches) > 4) {
        return trim($matches[4]);
    }
    // Order of attributes could be swapped around: <meta content="Buy my stuff" name="description" />
    preg_match('/<meta.*?content=("|\')(.*?)("|\').*?name=("|\')description("|\')/i', $html, $matches);
    if (count($matches) > 2) {
        return trim($matches[2]);
    }
    // No match
    return null;
}
Avatar billede cht22 Professor
28. juli 2017 - 19:36 #14
#10 Jeg prøvede også med den her tidligere hvor jeg ikke kunne få den til at virke. Men det var bare fordi jeg prøvede på example.com hvor der ingen meta tags er:

$tags = get_meta_tags('http://www.example.com/');


Så skal man bare gøre sådan her f.eks.:

$description = "";
if (isset($tags['description']))
$description = $tags['description'];
Avatar billede cht22 Professor
28. juli 2017 - 19:41 #15
#11 Men den synes jeg ikke jeg vil bruge for så henter jeg siden 2 gange så jeg allerede henter siden for at hente det der står mellem <title> og </title>, så vil jeg hellere bruge tidligere nævnte kode.
Avatar billede cht22 Professor
28. juli 2017 - 19:44 #16
Der skal bare byttes om på de 2 linjer:

$strpos = strpos(strtolower($strhttp),"name=description");
$strpos2 = strpos(strtolower($strhttp),"name=\"description\"");


Skal være:
$strpos = strpos(strtolower($strhttp),"name=\"description\"");
$strpos2 = strpos(strtolower($strhttp),"name=description");
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester