2010-12-12 61 views
21

pour mon site, je voudrais ajouter une nouvelle fonctionnalité.comment extraire des liens et des titres d'une page .html?

Je voudrais utilisateur de pouvoir télécharger son fichier de sauvegarde des signets (depuis tout navigateur si possible) pour que je puisse le télécharger à leur profil et ils ne doivent pas insérer tous manuellement ...

la seule partie que je manque pour faire cela c'est la partie de l'extraction du titre et l'URL du fichier téléchargé .. quelqu'un peut-il donner une idée par où commencer ou où lire?

option de recherche utilisé et (how to extract data from a raw html file) cette sis la question la plus liée à la mienne et il ne parle pas ..

Je ne me dérange pas si son utilisation de jquery ou php

merci beaucoup

+1

il serait probablement aider tout le monde si vous pouviez mettre en place des exemples des types de fichiers de sauvegarde de signets que vous souhaitez soutenir (pour chaque navigateur) – scoates

+1

Le format Netscape est commun: http://msdn.microsoft.com/en-us/library/aa753582(v=vs.85).aspx – Matthew

Répondre

43

Merci tout le monde, je l'ai eu!

le code final: Cela vous montre l'ancre texte attribué et href pour tous les liens dans un fichier .html

$html = file_get_contents('bookmarks.html'); 
//Create a new DOM document 
$dom = new DOMDocument; 

//Parse the HTML. The @ is used to suppress any parsing errors 
//that will be thrown if the $html string isn't valid XHTML. 
@$dom->loadHTML($html); 

//Get all links. You could also use any other tag name here, 
//like 'img' or 'table', to extract other tags. 
$links = $dom->getElementsByTagName('a'); 

//Iterate over the extracted links and display their URLs 
foreach ($links as $link){ 
    //Extract and show the "href" attribute. 
    echo $link->nodeValue; 
    echo $link->getAttribute('href'), '<br>'; 
} 

Encore une fois, merci beaucoup.

30

Ceci est probablement suffisant:

$dom = new DOMDocument; 
$dom->loadHTML($html); 
foreach ($dom->getElementsByTagName('a') as $node) 
{ 
    echo $node->nodeValue.': '.$node->getAttribute("href")."\n"; 
} 
+2

whre $ html c'est le chemin d'accès au fichier? Merci pour une réponse si rapide: D –

+2

@Toni, '$ html' est la chaîne contenant le code HTML. Vous pouvez utiliser '$ dom-> loadHTMLFile()' pour charger directement à partir d'un fichier. (Vous pouvez le préfixer avec '@' pour supprimer les avertissements.) – Matthew

+0

wow! Merci beaucoup! On dirait que c'est presque fini! Je peux obtenir des liens mais j'ai des problèmes avec les noms ou les titres (j'ai essayé les deux) –

5

en supposant que les liens sont stockés dans un fichier html la meilleure solution est probablement t o utiliser un analyseur html tel que PHP Simple HTML DOM Parser (jamais essayé moi-même). (L'autre option consiste à effectuer une recherche en utilisant la recherche de chaîne de base ou regexp, et vous devriez probablement jamais utiliser utiliser regexp pour analyser html).

Après avoir lu le fichier HTML en utilisant l'utilisation de l'analyseur, il est de trouver les fonctions a tags:

du tutoriel:

// Find all links 
foreach($html->find('a') as $element) 
     echo $element->href . '<br>'; 
3

Voici un exemple, vous pouvez utiliser dans votre cas ceci:

$content = file_get_contents('bookmarks.html'); 

Exécuter ceci:

<?php 

$content = '<html> 

<title>Random Website I am Crawling</title> 

<body> 

Click <a href="http://clicklink.com">here</a> for foobar 

Another site is http://foobar.com 

</body> 

</html>'; 

$regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
$regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)[email protected])?"; // User and Pass 
$regex .= "([a-z0-9-.]*)\.([a-z]{2,4})"; // Host or IP 
$regex .= "(\:[0-9]{2,5})?"; // Port 
$regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
$regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 


$matches = array(); //create array 
$pattern = "/$regex/"; 

preg_match_all($pattern, $content, $matches); 

print_r(array_values(array_unique($matches[0]))); 
echo "<br><br>"; 
echo implode("<br>", array_values(array_unique($matches[0]))); 

Sortie:

Array 
(
    [0] => http://clicklink.com 
    [1] => http://foobar.com 
) 

http://clicklink.com

http://foobar.com

1
$html = file_get_contents('your file path'); 

$dom = new DOMDocument; 

@$dom->loadHTML($html); 

$styles = $dom->getElementsByTagName('link'); 

$links = $dom->getElementsByTagName('a'); 

$scripts = $dom->getElementsByTagName('script'); 

foreach($styles as $style) 
{ 

    if($style->getAttribute('href')!="#") 

    { 
     echo $style->getAttribute('href'); 
     echo'<br>'; 
    } 
} 

foreach ($links as $link){ 

    if($link->getAttribute('href')!="#") 
    { 
     echo $link->getAttribute('href'); 
     echo'<br>'; 
    } 
} 

foreach($scripts as $script) 
{ 

     echo $script->getAttribute('src'); 
     echo'<br>'; 

} 
+0

Le style a échoué et la réponse est difficile à lire. S'il vous plaît modifier votre réponse et le rendre plus lisible – michaldo

+1

Trop de code pour la question donnée ... –